首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 上傳檔案大小限制完整解析:web.config 設定、IIS 限制與大檔案串流處理

     編輯:ASP.NET 基礎

核心設定:<httpRuntime>

<system.web>
  <httpRuntime executionTimeout="9999" maxRequestLength="2097151" />
</system.web>
  • maxRequestLength:單位 KB,預設 4096 (4MB)。上例設為 2097151 KB ≈ 2GB。
  • executionTimeout:單位 秒,預設 90 秒。大檔上傳需拉長避免逾時。

IIS 7+ 額外設定:<security>

若部署在 IIS 7 以上,還需在 Web.config 的 <system.webServer> 區段設定:

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="2147483648" /> <!-- 單位 Bytes,2GB -->
    </requestFiltering>
  </security>
</system.webServer>

常見誤區:單純調大 maxRequestLength 並不夠

ASP.NET 預設會將整個請求內容緩衝在記憶體中,再交給處理器。超大檔案會導致:

  • 伺服器記憶體暴增,甚至 OutOfMemoryException
  • 用戶端瀏覽器顯示「找不到伺服器」或連線重置,伺服器端無法捕捉例外

進階解法:使用 HttpWorkerRequest 分塊讀取串流

繞過 ASP.NET 內建緩衝,直接從 IIS 輸入管道讀取:

IServiceProvider provider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

byte[] preloaded = wr.GetPreloadedEntityBody(); // 取得已預載部分

if (!wr.IsEntireEntityBodyIsPreloaded())
{
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int read;
    while ((read = wr.ReadEntityBody(buffer, bufferSize)) > 0)
    {
        // 將 buffer 寫入檔案串流、資料庫或轉發至其他服務
        // 例如:fileStream.Write(buffer, 0, read);
    }
}

最佳實務建議

  1. 分塊上傳:前端使用 Plupload、FineUploader 等套件將大檔切片上傳,後端合併,避免單一請求過大。
  2. 暫存目錄權限:確保 ASP.NET 或 IIS_IUSRS 對上傳暫存資料夾有寫入權限。
  3. 驗證檔案類型:不要只信任副檔名,需檢查 Magic Number (File Signature) 與 MIME Type。
  4. 病毒掃描:整合 ClamAV 或商業引擎掃描上傳檔案。
  5. 進度顯示:搭配 HttpModule 或 SignalR 回報上傳進度。

參考連結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved