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

47

所有关于使用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造成I/O开销?

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


1
我认为这个问题应该能够满足你的需求。 - Jon Susiak
感谢 @JonSusiak - 但愿我几个小时前就能找到那个,我最后还是通过检查 MultipartFormDataStreamProvider 的源代码并使用 MultipartStreamProvider 提供程序将文件上传到 MemoryStream 而不是写入磁盘来完成了相同的事情。现在才回来发布答案。 - simbolo
@simbolo - 为什么你没有使用 HttpContext.Current.Request.Files[0].InputStream?你能解释一下它的缺点吗? - Merenzo
微软提供了一个非常好的上传文件示例:https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2 - xdiegom
@Merenzo编译器错误CS1061,“HttpRequestMessage”没有包含“Files”的定义,也没有可访问的扩展方法“Files”接受类型为“HttpRequestMessage”的第一个参数。 - lexeme
1个回答

90

已解决:

使用现有的简单 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();
    }
    return StatusCode(HttpStatusCode.OK);
}

我在哪里可以找到 IHttpActionResult? - guiomie
@guiomie 简单地谷歌一下:https://msdn.microsoft.com/zh-cn/library/system.web.http.ihttpactionresult(v=vs.118).aspx - simbolo
1
能否更新一下这段代码,使其能够编译通过?并非所有的代码路径都返回一个值。谢谢。 - mbx-mbx
5
@Magrangs - 你只需要返回一个Http结果,比如 return Ok(); - George Harnwell
2
MultipartMemoryStreamProvider 没有像 MultipartFormDataStreamProvider.FormData 一样访问请求中包含的表单数据的 API。 - Brent Woodle
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接