JS:带文件输入的 FormData 导致 Ajax 请求崩溃

Posted

技术标签:

【中文标题】JS:带文件输入的 FormData 导致 Ajax 请求崩溃【英文标题】:JS: FormData w/ File Input is Crashing Ajax Request 【发布时间】:2018-06-05 19:38:32 【问题描述】:

遇到了一个非常奇怪的问题,直到我将代码推送到实时服务器并尝试在我的 iPhone 上使用它之后才出现。

这是提交给我设置为记录所有传入请求(以及标头和方法)的 node.js 脚本,当出现以下问题时,日志显示没有收到任何内容。

无论如何:

$('#addrecord').on('submit', function(e) 
e.preventDefault();
var url = '/admin/app/addrecord'
    var data = $('#addrecord')[0];
    var formData = new FormData(data);

            $.ajax( // create an AJAX call...
             data: formData,
             processData: false,
             contentType: false,
             cache: false,
             type: "POST", // GET or POST
             url: url, // the file to call
             success: function(response)  // on success..
                if (response.name == 200) 
                    if (response.message == "add") addComplete(response.address);
                    else editComplete(response.address);;
                 
                 else 
                    console.log("Form Rejected");        
                   
              ,
              error: function(response)  
                console.log("Error - " + JSON.stringify(response));
               
          );
    );

这与我的 html 文件中通常的 <form id="addrecord" method="post" enctype="multipart/form-data" role="form"> ... </form> 配对。

所以问题是这个表单我有一个<input type="file" id="photo" name="photo"> 输入字段。如果我尝试在未在此输入中选择图像的情况下提交表单,则表单不会发送任何内容而只是挂起。服务器绝对没有收到任何内容(请记住,我正在记录每个请求)。

现在,如果我使用文件输入从手机中选择图像,或者如果我编辑 html 以删除输入文件字段,Ajax 请求会顺利触发,并且我的 node.js 服务器会完美接收所有内容.

我真的被这个难住了。有任何想法吗?

【问题讨论】:

【参考方案1】:

显然,这是 Safari 中的一个错误。

最终检测是否选择了文件,如果没有,则在提交表单之前从 DOM 中删除元素。

【讨论】:

以上是关于JS:带文件输入的 FormData 导致 Ajax 请求崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery-form的FormData上传文件带参数

使用ajax上传表单(带文件)

利用FormData对象 + XHR 新特性实现文件上传——带进度条

HTTP请求中 request payload 和 formData 区别?

form表单如何取得返回值

为什么我的文件数组没有附加到FormData?