IE 11:发送多部分表单数据请求时出错:流意外结束
IE 11: Error while sending Multipart Form Data request: Stream ended unexpectedly
我正在尝试使用 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
Chrome
------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
我提到了这些 SO 问题,但没有成功。
- Java - FormData in IE throwing org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
- Grails Multipart Service Stream ended unexpectedly
感谢任何有用的指点。谢谢。
发现了一个奇怪的问题。是这样解决的。
- 我们在表单末尾有复选框。当我们不 select 任何复选框时,就会出现上述问题。请求未正确形成,因此服务器抛出错误。
- 在表单末尾添加了一个隐藏字段(确保这是最后一个表单字段)并为其分配了一些值。
就是这样。像魔术一样工作!
更多信息here。
我遇到了同样的问题。我在隐藏的输入字段中只有 id 属性而缺少 name 属性,这给了我以下错误。将名称属性添加到输入隐藏类型字段后问题已解决。
id="timestamp" name="timestamp"
原因:org.apache.commons.fileupload.MultipartStream$MalformedStreamException:流意外结束
原因:org.apache.commons.fileupload.FileUploadException:流意外结束
这件事发生在我身上,问题是一旦选择了要上传的文件,就会出现 location.reload。这停止了要解析的流。
你提到的问题困扰了我很久。我终于找到了解决问题的方法。 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--
希望这对您有所帮助。干杯!!
我正在尝试使用 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
Chrome
------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
我提到了这些 SO 问题,但没有成功。
- Java - FormData in IE throwing org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
- Grails Multipart Service Stream ended unexpectedly
感谢任何有用的指点。谢谢。
发现了一个奇怪的问题。是这样解决的。
- 我们在表单末尾有复选框。当我们不 select 任何复选框时,就会出现上述问题。请求未正确形成,因此服务器抛出错误。
- 在表单末尾添加了一个隐藏字段(确保这是最后一个表单字段)并为其分配了一些值。
就是这样。像魔术一样工作!
更多信息here。
我遇到了同样的问题。我在隐藏的输入字段中只有 id 属性而缺少 name 属性,这给了我以下错误。将名称属性添加到输入隐藏类型字段后问题已解决。
id="timestamp" name="timestamp"
原因:org.apache.commons.fileupload.MultipartStream$MalformedStreamException:流意外结束 原因:org.apache.commons.fileupload.FileUploadException:流意外结束
这件事发生在我身上,问题是一旦选择了要上传的文件,就会出现 location.reload。这停止了要解析的流。
你提到的问题困扰了我很久。我终于找到了解决问题的方法。 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--
希望这对您有所帮助。干杯!!