防止在 ASP.NET 4.0 中上傳大文件
我們想限制我們網站上的最大上傳文件大小。我們已經在 web.config 中設置了適當的限制。我們遇到的問題是,如果上傳了一個非常大的文件(例如 1 GB),則在生成伺服器端錯誤之前上傳了整個文件,並且錯誤的類型是不同的,無論文件是巨大的還是巨大的不是。
有沒有辦法在實際上傳之前檢測待上傳文件的大小?
這是我將請求限制為 16 MB 的相關 web.config 設置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="12288"/> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="12582912"/> </requestFiltering> </security> </system.webServer> </configuration>我嘗試創建一個 HTTP 模組,以便可以在請求生命週期的早期攔截請求,但上傳似乎甚至在以下
BeginRequest事件之前發生HttpApplication:public class UploadModule : IHttpModule { private const int MaxUploadSize = 12582912; public void Init(HttpApplication context) { context.BeginRequest += handleBeginRequest; } public void Dispose() { } private void handleBeginRequest(object sender, EventArgs e) { // The upload takes place before this method gets called. var app = sender as HttpApplication; if (app.Request.Files.OfType<HttpPostedFile>() .Any(f => f.ContentLength > MaxUploadSize)) { app.Response.StatusCode = 413; app.Response.StatusDescription = "Request Entity Too Large"; app.Response.End(); app.CompleteRequest(); } } }更新:
我知道像 Flash 這樣的客戶端技術可以在上傳之前檢測文件大小,但我們需要一個伺服器端的解決方法,因為我們想要針對不支持 Flash/Java/ActiveX/Silverlight 的平台。我相信 IIS 或 ASP.NET 有一個錯誤,它允許上傳大文件,儘管有限制,所以我在這裡送出了一個錯誤。
與 HTTP 模組和處理程序相比,ISAPI 擴展是否可以讓我更好地控制請求處理,例如如果 Content-Length 標頭被視為大於允許的限制,則允許我中止上傳?
更新 2:
嘆息。Microsoft 已經關閉了我作為副本送出的錯誤,但沒有提供其他資訊。希望他們不只是在這件事上丟球。
更新 3:
萬歲!據微軟稱:
此錯誤已被解決,因為它已被移植到 IIS 產品團隊。IIS 團隊已經修復了該錯誤,該錯誤將包含在未來的 Windows 版本中。
Microsoft在其 Microsoft Connect 站點上做出了以下回應:
此錯誤已被解決,因為它已被移植到 IIS 產品團隊。IIS 團隊已經修復了該錯誤,該錯誤將包含在未來的 Windows 版本中。
如果您請求修復目前作業系統,則必須打開 QFE 請求。請讓我知道這是否是您要走的路線。請注意,打開 QFE 請求並不一定意味著它會被批准。
所以我想我們必須等待下一個版本的 IIS 來修復(除非 QFE 請求得到滿足,不管是什麼)。
問題是上傳是使用 HTTP Post 請求一次性發生的,所以您只能在完成後檢測到它。
如果您想對此進行更多控制,您應該嘗試基於 Flash 的上傳小元件,該小元件具有此功能以及更多功能。查看此連結<http://www.ajaxline.com/10-most-interesting-upload-widgets>