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

标签 c# asp.net asp.net-web-api multipartform-data

所有关于处理使用 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 .无需自定义类或提供程序。这不同于 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);
}

关于c# - WebAPI 文件上传 - 无需将文件写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965568/

相关文章:

c# - Lambda 表达式,其中 id 在 id 列表中

c# - Java 等同于 C# 的 Rfc2898DerivedBytes

c# - 在 F# 中创建一个操作以使用 c# 方法

jquery - 如何将 CSS 应用于在 jQuery 对话框中打开的 HTML 页面?

javascript - 错误。从 ASP.NET 页面获取 JSONP

c# - asp.net Web Api 在网络配置中添加 MediaTypeFormatter

c# - A^=B^=A^=B; C# Visual Studio 中的意外结果

c# - 指定的转换对于 SQLDataReader 上的 GetFloat 无效

c# - 从本地 MVC 站点调用本地 WebAPI

asp.net - WebApi 2 中 OData Controller http 请求的完整生命周期是什么