ASP.NET如何設定檔案上傳大小可超過預設4096KB(4MB)
根據MSDN記載,ASP.NET為防止駭客利用大檔案進行DOS(Denial Of Service)攻擊,所以把上傳檔案大小限制在4096KB(4MB),因此當上傳檔案超過4MB時,就會收到System.Web.HttpException 超出最大的要求長度的錯誤訊息,要解決這個問題有下列做法:
-
修改web網站或專案的web.config中httpRuntime區段的maxRequestLength屬性。
- httpRuntime格式:
<httpRuntime
executionTimeout = "number"
maxRequestLength = "number"
requestLengthDiskThreshold = "number"
useFullyQualifiedRedirectUrl = "[True|False]"
minFreeThreads = "number"
minLocalRequestFreeThreads = "number"
appRequestQueueLimit = "number"
enableKernelOutputCache = "[True|False]"
enableVersionHeader = "[True|False]"
apartmentThreading = "[True|False]"
requireRootedSaveAsPath = "[True|False]"
enable = "[True|False]"
sendCacheControlHeader = "[True|False]"
shutdownTimeout = "number"
delayNotificationTimeout = "number"
waitChangeNotification = "number"
maxWaitChangeNotification = "number"
enableHeaderChecking = "[True|False]"
/>
-
- 下面範例為將上傳檔案大小設定為10240KB(10MB),並設定timeout時間為300秒(5分鐘):
<httpRuntime maxRequestLength="10240" executionTimeout="300"/>
-
修改C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config(以.NET Framework 4.0為例)讓所有網站都繼承相同的設定。
- 下面範例為整台Web Server的上傳檔案大小設定為10240KB(10MB),並設定timeout時間為300秒(5分鐘):
<httpRuntime maxRequestLength="10240" executionTimeout="300"/>
-
以程式方式修改HttpRuntimeSection.MaxRequestLength屬性。
- 下面範例將檔案上傳大小設定為2048KB(2MB):
// Get the MaxRequestLength property value.
Response.Write("MaxRequestLength: " +
configSection.MaxRequestLength + "<br>");
// Set the MaxRequestLength property value to 2048 kilobytes.
configSection.MaxRequestLength = 2048;
上述方式都可以順利調整檔案上傳時地限制大小,但萬一使用者上傳的檔案還是超過限制,在做完上述調整後可能收到下列錯誤訊息:
- 無法顯示網頁
- 伺服器應用程式無法使用
- 已傳回類型 System.OutOfMemoryException 的例外狀況
因此最好的做法就是在Global.asax實作錯誤控制機制,當檔案上傳超過限制時,出現友善的錯誤訊息(雖然有一派說法指出,錯誤訊息應避免太詳細,以免讓駭客有機可趁,在此僅提供可能的解決方案,麻煩各位依照自己的狀況自行斟酌使用)。
- 下面範例實作當上傳檔案尺寸超過web.config中maxRequestLength時將網頁導到錯誤頁面。
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpRuntimeSection section = WebConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
if (section != null)
{
if (Request.ContentLength > (section.MaxRequestLength * 1024))
{
Response.Redirect("~/ErrorPage.aspx");
}
}
}
PS:必須注意當檔案過大時,會造成回應瀏覽器的動作失效。
參考資料:
http://msdn.microsoft.com/en-us/library/e1f13641.aspx
http://msdn.microsoft.com/en-us/library/e1f13641(v=vs.71).aspx
http://blog.miniasp.com/?tag=/maxrequestlength
http://blog.xuite.net/tolarku/blog/29175897
http://blog.miniasp.com/post/2009/06/19/check-webconfig-default-settings-and-options-with-ease.aspx
http://blogs.msdn.com/b/jchiou/archive/2008/03/10/asp-net-4mb.aspx