流式传输上传时获取上传文件的名称

时间:2014-12-05 16:50:06

标签: asp.net asp.net-mvc-4 asp.net-web-api

我的服务器有一个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实例的情况下获取原始文件名。我知道该名称随身体的一部分提出请求,但我无法弄清楚如何访问它。如何在不将上传的文件写入磁盘的情况下获取上传文件的名称?

1 个答案:

答案 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);
        });

在这种情况下,内容被读取为字节数组,但这同样适用于流。