WebAPI 文件上传 - 无需将文件写入磁盘
WebAPI File Uploading - Without writing files to disk
所有关于处理使用 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如何才能直接访问文件流而没有使用MultipartFormDataStreamProvider
的IO开销?
官方教程:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
已解决:
使用现有的简单方法MultipartMemoryStreamProvider
. No custom classes or providers required. This differers from the duplicate question,它通过编写自定义提供程序解决了这个问题。
然后在 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();
}
return StatusCode(HttpStatusCode.OK);
}
所有关于处理使用 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如何才能直接访问文件流而没有使用MultipartFormDataStreamProvider
的IO开销?
官方教程:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
已解决:
使用现有的简单方法MultipartMemoryStreamProvider
. No custom classes or providers required. This differers from the duplicate question,它通过编写自定义提供程序解决了这个问题。
然后在 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();
}
return StatusCode(HttpStatusCode.OK);
}