ASP.Net 2 中上傳的文件去哪裡了?
我正在建構一個允許使用者上傳文件的門戶。我需要確保這些文件不包含病毒。我理想的解決方案是讓主機 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 的記憶體問題,但在完全檢索之前您仍然無法訪問它。