【问题标题】:Jquery.ajax PUT data not parsed by PHPJquery.ajax PUT 数据未由 PHP 解析
【发布时间】:2025-12-09 13:10:02
【问题描述】:

我正在使用 Slim PHP 框架并尝试通过以下方式使用 Jquery.ajax() 发送 FormData:

var data = new FormData();
data.append('some_name', 'some_data');
data.append('a_file', $('input[name=the_file_form_field]').get(0).files[0]));

$.ajax({
    url: 'the_destination_url',
    data: data,
    processData: false,
    contentType: false,
    type: 'PUT',
    dataType: 'json',

    success: function(data, textStatus, jqXHR) {
        //Processing result here
    },

    error: function(jqXHR, textStatus, errorThrown) {
        //Processing result here
    }
});

但是,我尝试了以下场景:

  • Works:Formdata 没有文件,添加 _METHOD=PUT 并将 $.ajax 设置为类型:POST
  • 不起作用(php 没有收到 PUT 数据):没有文件的 Formdata,设置 $.ajax 为 type:PUT
  • 不起作用(方法保持 POST):带有文件的 Formdata,添加 _METHOD=put 并将 $.ajax 设置为类型:POST
  • 不起作用(php 没有收到 PUT 数据):带有文件的 Formdata,将 $.ajax 设置为 type:PUT

我有什么遗漏的吗?

应用程序要求它使用 PUT 请求,因此不可能使用 POST 请求。

【问题讨论】:

  • 请指定doesn't work。服务器是否没有正确响应?还是 ajax 没有收到正确的响应?
  • 服务器未正确接收(或解析)PUT 数据,但 chrome 控制台中的请求正文清楚地显示它已正确生成
  • 如果服务器收到有效的 PUT 请求但可能无法正常工作,我们现在究竟如何帮助您解决问题?我想我们每个人都想成为一个有远见的人,但我们不是。
  • 好吧,例如告诉我 jQuery 是否正确,或者是否有人在 Slim 框架中有相同的经验。任何非居高临下的东西。
  • 您使用的是什么 Web 服务器以及如何为 PHP 提供服务(php-fpmmod_php)?

标签: php jquery ajax slim


【解决方案1】:

尝试将数据作为对象发送。 例如

data: {'formData' : data},

您的 Ajax 请求应如下所示

$.ajax({
    url: 'the_destination_url',
    data: {'formData' : data},
    processData: false,
    contentType: false,
    type: 'PUT',
    dataType: 'json',

    success: function(data, textStatus, jqXHR) {
        //Processing result here
    },

    error: function(jqXHR, textStatus, errorThrown) {
        //Processing result here
    }
});

【讨论】:

  • 这不起作用,因为请求正文将导致 [Object object],当请求类型为 GET 或 POST 时,这将起作用
【解决方案2】:

我使用来自https://bugs.php.net/bug.php?id=26004的人的 cmets 解决了这个问题

显然,只要超过 post_max_size 指令,PHP 就会默默地丢弃所有传入的 POST 数据。

除了post_max_size,检查upload_max_filesize 指令也很聪明。

【讨论】:

    【解决方案3】:

    在 PHP 中获取从 Ajax JQuery 发送的 PUT 数据的最佳方法是:

    在 JavaScript 中像这样发送您的数据:

    其中 mydata 是 {k1 : "val1" , "k2" : "val2" , }

     $.ajax({
         url: "data.php",
         contentType : "json",
         data : mydata,
         method:"PUT",
         success: function (data) {
             console.log(data);
         },
         error: function (err) {
             console.log(err);
         },
         complete:function (e) {
             console.log(e);
         }
     });
    

    data.php文件中数据的获取方式是:

    parse_str(file_get_contents("php://input"),$putVars);
    var_dump( $putVars ); // input from your form
    

    【讨论】: