我的服务器有一个API来上传文件并将其转换为PDF。现在,文件上传,保存到磁盘然后转换。请参阅下面的(修剪过的)代码:
public class ConversionController : ApiController {
public async Task<HttpResponseMessage> PostData() {
var root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
var file = provider.FileData.First();
var originalName = file.Headers.ContentDisposition.FileName;
var fileStream = new FileStream(file.LocalFileName, FileMode.Open, FileAccess.Read);
// convert file stream and return the PDF response ...
}
}
正如您所看到的,我将文件读取到磁盘,然后立即获取它的流,以便我可以将它提供给我们的转换函数(它需要一个流)。这似乎是每次都将文件保存到磁盘的浪费。因此,我可以使用ReadAsMultipartAsync()
来代替保存到磁盘的ReadAsStreamAsync()
,这将为我提供可以直接提供给转换函数的流。
我与ReadAsMultipartAsync()
的问题在于,我无法弄清楚如何在不使用MultipartFileData
实例的情况下获取原始文件名。我知道该名称随身体的一部分提出请求,但我无法弄清楚如何访问它。如何在不将上传的文件写入磁盘的情况下获取上传文件的名称?
答案 0 :(得分:2)
您可以使用MultipartMemoryStreamProvider
,例如:
var provider = new MultipartMemoryStreamProvider();
var task = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
{
var file = provider.Contents.First();
var fileContents = await file.ReadAsByteArrayAsync();
var filename = file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
/// do other stuff
return Request.CreateResponse(HttpStatusCode.OK);
});
在这种情况下,内容被读取为字节数组,但这同样适用于流。