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の質問に言及しましたが、無駄でした。
有用なポインタがあれば大歓迎です。ありがとう。
奇妙な問題が判明しました。これが解決方法です。
そのこと。魔法のように働いた!
詳細 ここ 。
私も同じ問題を抱えていました。 id属性しかなく、非表示の入力フィールドにname属性がないため、以下のエラーが発生しました。入力非表示タイプフィールドにname属性を追加すると、問題が解決しました。
id = "timestamp" name = "timestamp"
原因:org.Apache.commons.fileupload.MultipartStream $ MalformedStreamException:ストリームが予期せず終了しました原因:org.Apache.commons.fileupload.FileUploadException:ストリームが予期せず終了しました
あなたがおっしゃった問題は私を長い間悩ませてきました。私はついにこの問題の解決策を手に入れました。 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--
お役に立てれば。乾杯!!
私に起こったのは、アップロードするドキュメントが選択された後、location.reloadがあったことでした。これにより、解析されるストリームが停止しました。