2014-12-05 69 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