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

时间:2015-01-12 13:45:18

标签: java jquery file-upload internet-explorer-11 multipartform-data

我正在尝试使用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);
        });
}

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

来自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

------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--

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

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);
}

代码在Chrome和Firefox上运行良好,但在我尝试使用IE11时会抛出以下异常。

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly

我提到了这些问题,但徒劳无功。

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

4 个答案:

答案 0 :(得分:10)

发现了一个奇怪的问题。这就是它的解决方法。

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

这&#39;它。像魔术一样工作!

更多信息here

答案 1 :(得分:2)

我遇到了同样的问题。我只有id属性,并在隐藏的输入字段中缺少name属性,这给了我以下错误。将name属性添加到输入隐藏类型字段后,问题已解决。

ID =&#34;时间戳&#34;命名=&#34;时间戳&#34;

引起:org.apache.commons.fileupload.MultipartStream $ MalformedStreamException:Stream意外结束 引起:org.apache.commons.fileupload.FileUploadException:流意外结束

答案 2 :(得分:1)

它发生在我身上,问题是,一旦选择上传文档,就会有location.reload。这停止了​​要解析的流。

答案 3 :(得分:1)

您提到的问题困扰了我很长时间。我终于有了解决这个问题的方法。 IE将空名称表单数据附加到在服务器上解析的formData请求对象的末尾,因此会发生错误。

下面是在修复之前发送的表单数据请求对象:

-----------------------------7e3195134f056c
Content-Disposition: form-data; name="csrfToken"

8394D82F5A776708F13CDC6D4B4DE1485C1EC05625E63B2E
-----------------------------7e3195134f056c
Content-Disposition: form-data; name="ACTION"

DELETE_LOGO
-----------------------------7e3195134f056c
Content-Disposition: form-data; name="ORG_ID"

1879048492
-----------------------------7e3195134f056c
Content-Disposition: form-data; name=" 
-----------------------------7e3195134f056c--

为了解决该问题,在表单元素的末尾添加了一个额外的隐藏字段。

    <csrf:form name="OrgLogoEdit" METHOD="POST" ACTION="/logo" onKeyDown="" enctype="multipart/form-data" accept-charset="UTF-8">
        <INPUT TYPE = HIDDEN NAME = "<%= Control._ACTION %>" VALUE = "<%= OrganizationLogo._UPLOAD_LOGO %>">
        <INPUT TYPE = HIDDEN NAME = "<%= Control.ORG_ID %>" VALUE = "<%= organization.getId() %>">

        <div class="cropit-preview"></div>
        <input type="range" min="0" max="100" class="cropit-image-zoom-input" step="any">
        <input type="hidden" name="dummyIEField"> <!-- this dummy hidden field resolves the stream ended unexpectedly issue -->
    </csrf:form>

现在发送请求正文如下,已成功解析:

-----------------------------7e3195134f056c
Content-Disposition: form-data; name="csrfToken"

8394D82F5A776708F13CDC6D4B4DE1485C1EC05625E63B2E
-----------------------------7e3195134f056c
Content-Disposition: form-data; name="ACTION"

DELETE_LOGO
-----------------------------7e3195134f056c
Content-Disposition: form-data; name="ORG_ID"

1879048492
-----------------------------7e3195134f056c
Content-Disposition: form-data; name="dummyIEField"


-----------------------------7e3195134f056c--

希望这会有所帮助。欢呼!!