在不接触磁盘的情况下读取 Multipart/Form-Data

Read Multipart/Form-Data without touching disk

好的,所以我想在我的 WebAPI 中接收 Multipart/Form-Data POST 请求,并使用其中包含的文件和表单字段进行处理。很简单,就像这样:

var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());

await Request.Content.ReadAsMultipartAsync(provider);

var formValue = provider.FormData["form_value_here"];

var files = provider.FileData.Select(d => d.LocalFileName);

很容易获得我需要的任何表单域或特定文件。但是,我希望具有类似的功能,但我不想在调用 ReadAsMultipartAsync 时将文件保存到磁盘,而是希望将它们保存在 Stream

这样做的原因是,我想散列正在发布的文件的值,并在必要时拒绝请求,然后再将文件保存到磁盘。是否有我错过的内置提供程序或 class 具有方便的 API?

您可以使用 MultipartMemoryStreamProvider 以流的形式获取表单数据。你会想要这样的东西:

if (!Request.Content.IsMimeMultipartContent())
    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var fileNames = new List<string>();
foreach (var file in provider.Contents)
{
    fileNames.Add(file.Headers.ContentDisposition.FileName.Trim('\"'));
    var buffer = await file.ReadAsByteArrayAsync();
    //hash values, reject request if needed
}

return Ok();