web-dev-qa-db-ja.com

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

ブラウザの開発ツールから調べると、これらはそれぞれのリクエストの内容です。

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の質問に言及しましたが、無駄でした。

有用なポインタがあれば大歓迎です。ありがとう。

8

奇妙な問題が判明しました。これが解決方法です。

  • フォームの最後にチェックボックスがありました。上記の問題は、チェックボックスを選択しない場合に発生していました。リクエストが正しく形成されなかったため、サーバーがエラーをスローしました。
  • フォームの最後に非表示フィールドを追加し(これが最後のフォームフィールドであることを確認してください)、それに何らかの値を割り当てました。

そのこと。魔法のように働いた!

詳細 ここ

10

私も同じ問題を抱えていました。 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--

お役に立てれば。乾杯!!

1
shaangon

私に起こったのは、アップロードするドキュメントが選択された後、location.reloadがあったことでした。これにより、解析されるストリームが停止しました。

1
sanjeev sobhun