Asp.net

ASP.Net 2 中上傳的文件去哪裡了?

  • February 14, 2013

我正在建構一個允許使用者上傳文件的門戶。我需要確保這些文件不包含病毒。我理想的解決方案是讓主機 OS AV 監視臨時文件夾並掃描任何傳入的文件。

在 ASP.Net 2 中上傳文件時,它是寫入臨時文件夾中的磁碟,還是保留在記憶體中?如果寫入磁碟,IIS 會鎖定它以使 AV 無法刪除它嗎?如果它被寫入磁碟,在哪裡?

我認為理想的方法是擁有一個“傳入”文件夾,該文件夾已被授予 ASP.NET 保存文件的必要權限。我從未遇到過即使在呼叫SaveAsFileUpload 控制項後文件仍處於鎖定狀態的情況。

請注意,FileUpload 控制項在您呼叫之前不會上傳文件SaveAs,這是文件被持久保存到伺服器上的磁碟的時間。它似乎將所有文件內容保存在一個中,在呼叫該方法HttpInputStream時將其寫入磁碟。SaveAs

然後,您的 AV 應用程序應該可以自由掃描文件。如果出現錯誤,您可以向使用者提供相關回饋。

這是 ASP.NET 如何處理文件的實際問題。它取決於版本,但 2.0 和所有後續版本都會在您有機會處理它們之前將上傳內容寫入磁碟。上面的答案實際上是錯誤的——2.0 以上的 ASP.NET會將文件寫入磁碟。如果您考慮一下,將上傳文件載入到記憶體中會給您帶來 DDOS 漏洞,因為大文件會佔用越來越多的伺服器記憶體。按版本,這是 ASP.NET 的行為方式:

  • ASP.NET 1.0 和 1.1 將整個請求載入到記憶體中,然後您才能訪問它。這意味著大文件可能會填滿所有記憶體,導致異常並以其他方式關閉伺服器。
  • ASP.NET 2.0 引入了一種用於上傳的磁碟記憶體方案,在客戶端程式碼可以處理之前再次擷取並處理它。可以按如下方式訪問臨時文件夾:

string uploadFolder = Path.Combine(HttpRuntime.CodegenDirInternal, “uploads”);

  • 從 ASP.NET 4.0 開始,上面引用的屬性名稱是 HttpRuntime.CodegenDir:

string uploadFolder = Path.Combine(HttpRuntime.CodegenDir, “uploads”);

至少現在它已記憶體到磁碟,因此您不會遇到 1.0 和 1.1 的記憶體問題,但在完全檢索之前您仍然無法訪問它。

引用自:https://stackoverflow.com/questions/519542