我的服務器有一個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