WebAPI文件上传 - 无需将文件写入磁盘

sim*_*olo 45 c# asp.net multipartform-data asp.net-web-api

有关处理使用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
}
Run Code Online (Sandbox Code Playgroud)

但是,在处理期间,文件会自动写入目录.

当我可以HttpContext.Current.Request.Files[0].InputStream直接在内存中使用访问给定的文件流时,似乎有很多麻烦.

WebAPI如何直接访问文件流而无需使用IO开销MultipartFormDataStreamProvider

官方教程:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2

sim*_*olo 88

解决了:

使用现有的简单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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Magrangs - 你只需要返回一个Http结果,比如返回Ok(); (4认同)
  • “MultipartMemoryStreamProvider” 没有像“MultipartFormDataStreamProvider.FormData” 那样访问请求中包含的表单数据的 API。 (2认同)