Input::all() 在 FormData 对象通过后为空

Input::all() empty after FormData object passed

我有一个表单需要在提交前处理。该表单有几个 textradio 输入,以及一个 file 输入。我正在使用 jQuery 来传递表单数据:

$button.on('click', function(e) {
    e.preventDefault();

    var formData = new FormData($('.js-my-form')[0]);

    $.ajax({
        type: 'GET',
        url: '/get-data',
        data: formData,
        contentType: false,
        processData: false
    }).done(function(response) {
        // handle response
    });

});

然后,在Laravel控制器中:

$input = Input::all() // <- EMPTY ARRAY

不知道为什么 Input 是空的。任何帮助表示赞赏。

首先,我建议使用类型 'POST' 在您的方法中传递数据,其次,尝试序列化表单数据

 $.ajax({
        type: 'POST',
        url: '/get-data', /*Route laravel*/
        data: formData.serialize(),
        contentType: false,
        processData: false
    }).done(function(response) {
        // handle response
    });

所以,我找不到任何资源来证实这一点,但似乎 FormData 不适用于 GET 类型 - 至少在使用 jQuery 的 $.ajax()函数。

已将 GET 更改为 POST - 表单输入毫无问题地到达 Laravel 控制器。

我不确定我是否喜欢它,我想,因为我实际上没有 POST 任何东西,而是 GET 获取我需要的信息。无论如何,它有效。

您的问题是您正在使用 GET 发送带有 enctype = multipart/form-data 的请求。当您使用本机 FormData 对象时,这是您默认获得的格式。您可以阅读 how to send the form's data

using the POST method and setting the enctype attribute to application/x-www-form-urlencoded (default);

using the POST method and setting the enctype attribute to text/plain;

using the POST method and setting the enctype attribute to multipart/form-data;

using the GET method (in this case the enctype attribute will be ignored).

因此,如果您将请求设置为 GET,请求正文中的表单内容将被忽略。 enctype 属性告诉服务器如何处理您的请求。这就是为什么你应该使用 POST.

注意写的时候

contentType: false,
processData: false

你是在告诉 jQuery 不要弄乱你正在传递的数据,并保持你的原生 Formdata 对象不变。这将导致自动设置 enctype。