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

Posted

技术标签:

【中文标题】WebAPI 文件上传 - 无需将文件写入磁盘【英文标题】:WebAPI File Uploading - Without writing files to disk 【发布时间】:2015-03-13 23:20:05 【问题描述】:

有关处理使用 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

【问题讨论】:

我认为This Question 应该能满足您的需求。 谢谢@JonSusiak - 我希望我在几个小时前发现,通过检查源代码或MultipartFormDataStreamProvider 并使用MultipartStreamProvider 提供程序给我提供了完全相同的事情在MemoryStream 中上传文件,而不是将其写入磁盘。刚刚开始发布答案。 @simbolo - 为什么没有你使用HttpContext.Current.Request.Files[0].InputStream?你能解释一下缺点吗? 微软有一个很好的上传文件的例子:docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/… 【参考方案1】:

已解决:

使用现有的简单MultipartMemoryStreamProvider。不需要自定义类或提供程序。这与 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);

【讨论】:

在哪里可以找到 IHttpActionResult ? @guiomie 简单的谷歌:msdn.microsoft.com/en-us/library/… 能否更新此代码以便编译?并非所有代码路径都返回值。谢谢。 @Magrangs - 您只需要返回一个 Http Result,例如 return Ok(); 方法结束:return Request.CreateResponse(HttpStatusCode.OK);

以上是关于WebAPI 文件上传 - 无需将文件写入磁盘的主要内容,如果未能解决你的问题,请参考以下文章

无需在 Python 中写入磁盘即可加入 .wav 文件

PHP文件上传写入磁盘错误

我使用 .net core webapi 怎么获取图片并存到本地磁盘去

Node.js 文件上传(Express 4、MongoDB、GridFS、GridFS-Stream)

WebApi2 文件图片上传下载

从 JavaScript 将文件写入 Windows 操作系统以保留浏览器配置