net6 WebAPI大檔案上傳

奚毛宇發表於2024-07-04

最近由於客戶需要上傳大檔案,所以研究了一下檔案上傳的問題

net6 上傳檔案分為兩種情況:buffering和streaming(快取和流)

Buffering:

我們平時採用的透過IFormFile上傳檔案的方式就是Buffering,此方式會將檔案全部快取起來。這種方式簡單,但對記憶體和硬碟空間造成負擔。關於快取,這裡有個誤區,我們用stream 操作檔案的時候,會將檔案全部load到記憶體中,但檔案快取並不是全部快取到記憶體中,因為我們的電腦預設開啟了虛擬快取,所以,當我們的記憶體空間不足的時候,會將檔案快取到當前user的臨時資料夾下,舉個例子:當我們的記憶體只有1G空間情況下,上傳一個5G的檔案並不會導致系統崩潰,因為檔案會被儲存到臨時資料夾下,此時觀察臨時資料夾的硬碟使用量迅速增大到5G,當檔案全部上傳完成,臨時檔案會被清理。所以,當高併發的情況下,磁碟空間會很快耗盡。

Streaming

Streaming上傳的時候,不會在臨時資料夾建立臨時檔案,而是直接將檔案以流的方式直接儲存到指定檔案路徑下,舉個例子:當我們的記憶體只有1G空間情況下,上傳一個5G的檔案,此時觀察臨時資料夾的硬碟使用量只有很小的增長,檔案會在一開始就被建立,不斷接收傳過來的資料,此時有個現象需要注意,當上傳意外終止時,檔案會保留下來,但內容不完整,需要自己手動處理一下。

當然,在處理大檔案時,還可以考慮採用分片上傳的模式,此問題正在研究中。

以上內容參考於:

https://learn.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0

相關文章