IE 11:发送Multipart Form Data请求时出错:Stream意外结束

Pra*_*kar 8 java jquery file-upload multipartform-data internet-explorer-11

我正在尝试使用jQuery AJAX调用上传文件和其他一些表单字段.

这是一个调用服务器上URL的常用函数:

function uploadDocument(rquestURL,formId,callback){
        $.ajax({
            type : 'POST',
            url : rquestURL,
            cache:false,
            processData:false,
            contentType:false,
            data : new FormData($("#"+formId)[0])
        }).done(function(response) {
            callback(response);
        });
}
Run Code Online (Sandbox Code Playgroud)

在从浏览器的开发工具中检查时,这些是相应的请求内容:

来自IE11

-----------------------------7dfad39402e6
Content-Disposition: form-data; name="subject"

Test
-----------------------------7dfad39402e6
Content-Disposition: form-data; name="message"

Test test
-----------------------------7dfad39402e6
Content-Disposition: form-data; name="announcementAttachment"; filename=""
Content-Type: application/octet-stream

<Binary File Data Not Shown>
---------------------------7dfad39402e6
Run Code Online (Sandbox Code Playgroud)

------WebKitFormBoundaryp8rj3ArKDsbYw0BZ
Content-Disposition: form-data; name="subject"

Test
------WebKitFormBoundaryp8rj3ArKDsbYw0BZ
Content-Disposition: form-data; name="message"

Test test
------WebKitFormBoundaryp8rj3ArKDsbYw0BZ
Content-Disposition: form-data; name="announcementAttachment"; filename=""
Content-Type: application/octet-stream


------WebKitFormBoundaryp8rj3ArKDsbYw0BZ--
Run Code Online (Sandbox Code Playgroud)

在服务器端,我们将请求解析为:

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

final FileItemFactory factory = new DiskFileItemFactory();
final ServletFileUpload fileUpload = new ServletFileUpload(factory);

if (ServletFileUpload.isMultipartContent(request)) {
        // get the request content and iterate through
        items = fileUpload.parseRequest(request);
}
Run Code Online (Sandbox Code Playgroud)

代码在Chrome和Firefox中运行良好,但是当我从IE11尝试时抛出以下异常.

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly
Run Code Online (Sandbox Code Playgroud)

我提到了这些问题但是徒劳无功.

任何有用的指针都表示赞赏.谢谢.

Pra*_*kar 10

结果出了一个奇怪的问题.这是如何解决的.

  • 我们在表单末尾有复选框.当我们不选择任何复选框时,会出现上述问题.请求没有正确形成,因此服务器抛出错误.
  • 在表单的末尾添加了一个隐藏字段(确保这是最后一个表单字段)并为其分配了一些值.

那就是它.像魔术一样工作!

更多信息在这里.