檔案上傳的一些疑惑

這幾天在寫檔案上傳的程式時針對Stream的讀寫有些疑惑一直無法搞懂,survery了一些文章後,將搞懂的整理如下:

Client透過什麼樣的方式,傳送給Server端?

   在送出的表單設定Content-Type:multipart/form-data,此為將表單內若有其他不同類型資料時需包成一個Request,並將檔案轉成2進位透過Post送出。送出前透過boundary="分隔的識別字串"來區隔送出的資料,如下圖boundary=----WebKitFormBoundaryEZDuDWbyAS56kbIR分隔2個欄位,一個為輸入文字(123),另一個為上傳檔案。

image

Client端送出後,Server端接收到的檔案Stream來源為何?

   IIS收到資料後會將完整的內容暫存在Temp File內,而應用程式再將相關資訊讀出,例:Controller收到的FormCollection及HttpPostedFileBase檔案上傳物件。HttpPostedFileBase.InputStream的基底類別是FileStream,用來讀取暫存檔內屬於上傳檔案的部份。這也是釐清為何在觀察w3wp.exe,在Server端還未讀取Stream的資料時,記憶體不會增加。

圖:為HttpPostedFileBase.InputStream Trace後的資訊

image

參考來源

http://huan-lin.blogspot.com/2012/04/about-aspnet-file-upload.html

這個網誌中的熱門文章

[.NET Core] 將專案發行至IIS

[TFS] 分支與合併