2014-12-05 145 views
1

我的服务器有一个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

看看http://stackoverflow.com/questions/12586590/request-content-readasmultipartasync-error。不是重复的问题,但第一个答案中的代码示例演示了如何获取文件名。或者,查看Fiddler(http://www.telerik.com/fiddler)或浏览器的调试器中的请求,并查看包含该文件名的头,并从HttpContext.Current的Request对象中检索它。 – 2014-12-05 16:54:17

+0

这就是我现在的代码,这迫使我在获取文件名之前写入磁盘(据我所知)。我想在不写入磁盘的情况下获取名称。此外,文件名不在标题中,它位于多部分表单主体中。我不认为我有直接的访问权限。 – GJK 2014-12-05 16:57:42

+0

目前我无法通过调试器运行它,但是我没有看到它写入磁盘的位置,除非服务器在幕后或执行'PostData()'方法之前进行。 (我可能只是错过了一些东西。) – 2014-12-05 16:59:48

回答

1

您可以使用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); 
     }); 

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

+0

谢谢,这正是我所需要的。我看着不同的提供商,但由于某种原因,我没有遇到内存提供商。 – GJK 2014-12-05 19:22:55

+0

很高兴帮助:) – 2014-12-05 19:23:18