28

ASP.NETにあるチュートリアルに従って、次のような非同期ファイルアップロードを実行するためのWebAPIコントローラーメソッドを実装しました。

public Task<HttpResponseMessage> PostFormData()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    // Read the form data and return an async task.
    var task = Request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
            {
                Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        });

    return task;
}

標準のマルチパートHTMLフォームを介したファイルのアップロードは完全に機能します。ただし、別の開発者がFlexのFileReferenceクラスによって構築されたマルチパートフォームを介してファイルをアップロードしようとすると、エラーがスローされます。

MIMEマルチパートストリームの予期しない終了。MIMEマルチパートメッセージが完了していません。

問題がWebAPIにあるのかFlexにあるのかわかりません。影響のない関連する修正(ASP.Net Web APIを使用したマルチパートフォームPOST)と、最近の修正( webapiアップロードでの「MIMEマルチパートストリーム。MIMEマルチパートメッセージが完了していません」エラー)を見つけました。2番目のリンクが当てはまる場合、Nugetを介して利用できるWeb APIの現在のリリースに含まれているかどうかを誰かが知っていますか?議論は5月で、Nugetからの最新のリリースは8月だったので、この修正はすでに展開されており、私の問題の根本的な原因ではないと思います。

4

7 に答える 7

37

MVC4でも同じ問題が発生しましたが、Willは正しいので、入力に名前を追加してください。

<input type="file" id="fileInput" name="fileInput"/>

そして、すべての魔法が戻って機能しています!

于 2013-08-13T14:43:28.677 に答える
36

フレックスでも同じ問題がありました。そして、以下はそれを解決したコードです。基本的に、カスタムストリームを使用して、asp.netWebAPIが期待する改行を追加しました。

        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
        MemoryStream tempStream = new MemoryStream();
        reqStream.CopyTo(tempStream);



        tempStream.Seek(0, SeekOrigin.End);
        StreamWriter writer = new StreamWriter(tempStream);
        writer.WriteLine();
        writer.Flush();
        tempStream.Position = 0;


         StreamContent streamContent = new StreamContent(tempStream);
         foreach(var header in Request.Content.Headers)
         {
             streamContent.Headers.Add(header.Key, header.Value);
         }

        // Read the form data and return an async task.
         await streamContent.ReadAsMultipartAsync(provider);

お役に立てれば。

于 2013-06-25T06:55:53.187 に答える
10

既存の調査を読み、codeplexの問題を追跡すると、他の誰かがこの問題が9月にまだ存在することを確認したようです。

彼らは、MVC4が「\r\n」を終了せずにアップロードを解析できないと信じています。

この問題は非常に単純ですが、修正するのは非常に困難です。問題は、UploadifyがMultiPartFormメッセージの最後に「\ r\n」を追加しないことです。

http://aspnetwebstack.codeplex.com/discussions/354215

Flexアップロードが「\r\n」を追加することを確認する価値があるかもしれません

于 2012-12-08T14:42:54.227 に答える
10

ここに着陸する人のためにグーグル:

MIMEマルチパートストリームの予期しない終了。MIMEマルチパートメッセージが完了していません。

リクエストストリームを複数回読み取ると、この例外も発生します。リクエストストリームは1回しか読み取れないと説明するソースが見つかるまで、何時間も苦労しました。

私の場合、aを使用してリクエストストリームを読み取ろうとするMultipartMemoryStreamProviderと同時に、apiメソッドのパラメーター(リクエスト本文から取得)を指定することでASP.NETに魔法をかけさせました。

于 2017-02-15T17:27:11.157 に答える
4

画像ファイルが最初にアップロードされる仮想ディレクトリ(以下の例では「〜/ App_Data」ディレクトリ)が物理的に存在することを確認してください。プロジェクトを公開すると、出力ファイルに含まれない場合があります。

string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
于 2017-05-02T14:44:08.460 に答える
1

postメソッドに設定していたヘッダーを削除したところ、この問題は解決しました。

于 2018-05-21T07:39:46.190 に答える
1

問題はこの行です:

string root = HttpContext.Current.Server.MapPath("~/App_Data");

これはローカルホストでのみ機能します。代わりに、HttpContext.CurrentなどのSystem.Webオブジェクトが使用できないコンテキスト(静的メソッドなど)でHostingEnvironment.MapPathを使用できます。

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

Server.MapPathとHostingEnvironment.MapPathの違いは何ですか?も参照してください。

この回答への参照サーバーマップパスを実行する方法。

于 2019-05-16T14:42:06.103 に答える