我的服务器有一个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
实例的情况下使用原始文件名。我知道这个名字与请求一起作为主体的一部分,但我无法弄清楚如何访问它。如何在不将上传的文件写入磁盘的情况下获取上传文件的名称?
看看http://stackoverflow.com/questions/12586590/request-content-readasmultipartasync-error。不是重复的问题,但第一个答案中的代码示例演示了如何获取文件名。或者,查看Fiddler(http://www.telerik.com/fiddler)或浏览器的调试器中的请求,并查看包含该文件名的头,并从HttpContext.Current的Request对象中检索它。 – 2014-12-05 16:54:17
这就是我现在的代码,这迫使我在获取文件名之前写入磁盘(据我所知)。我想在不写入磁盘的情况下获取名称。此外,文件名不在标题中,它位于多部分表单主体中。我不认为我有直接的访问权限。 – GJK 2014-12-05 16:57:42
目前我无法通过调试器运行它,但是我没有看到它写入磁盘的位置,除非服务器在幕后或执行'PostData()'方法之前进行。 (我可能只是错过了一些东西。) – 2014-12-05 16:59:48