ASP.NET如何設定檔案上傳大小可超過預設4096KB(4MB)

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://www.dotblogs.com.tw/hatelove/archive/2010/01/14/fileuploadmaxrequestlengthtocustomerrorpage.aspx

http://blog.miniasp.com/post/2009/06/19/check-webconfig-default-settings-and-options-with-ease.aspx

http://msdn.microsoft.com/zh-tw/library/system.web.configuration.httpruntimesection.maxrequestlength(v=vs.100).aspx

http://blogs.msdn.com/b/jchiou/archive/2008/03/10/asp-net-4mb.aspx