web-dev-qa-db-ja.com

WebAPIファイルのアップロード-ファイルをディスクに書き込まずに

FormDataを使用してASP.NET WebAPIハンドラーにアップロードされたファイルの処理に関するすべてのドキュメント/チュートリアル/質問では、MultipartFormDataStreamProviderを使用してマルチパートストリームを処理し、関連するフォームフィールドとファイルに分割します。

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

await Request.Content.ReadAsMultipartAsync(provider);

foreach (MultipartFileData file in provider.FileData)
{
   // File
}

ただし、ファイルは処理中にディレクトリに自動的に書き込まれます。

単にHttpContext.Current.Request.Files[0].InputStreamは、メモリ内の特定のファイルストリームに直接アクセスします。

WebAPIは、IO MultipartFormDataStreamProvider?を使用するオーバーヘッドなしでファイルストリームに直接アクセスする方法は何ですか?

公式チュートリアル: http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2

44
simbolo

解決済み:

既存の単純な MultipartMemoryStreamProvider を使用します。カスタムクラスやプロバイダーは必要ありません。これは、カスタムプロバイダーを作成してソリューションを解決した 重複した質問 とは異なります。

次に、WebAPIハンドラーで次のように使用します。

public async Task<IHttpActionResult> UploadFile()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        return StatusCode(HttpStatusCode.UnsupportedMediaType);
    }        

    var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();

    foreach (var stream in filesReadToProvider.Contents)
    {
        var fileBytes = await stream.ReadAsByteArrayAsync();
    }
}
88
simbolo