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

ASP.NET 大檔案上傳完整設定指南:Web.config、IIS、斷點續傳考量

     編輯:關於ASP.NET

ASP.NET 預設限制上傳 4MB,大檔案上傳需調整 Web.config、IIS 要求限制、應用程式集區設定,並考慮斷點續傳、進度顯示、記憶體壓力等工程化課題。本文提供完整設定清單與最佳實踐。

核心設定:Web.config httpRuntime

<system.web>
  <!-- 
    maxRequestLength: 最大要求長度 (KB),預設 4096 (4MB)
    executionTimeout: 要求執行逾時 (秒),預設 110 秒
    requestLengthDiskThreshold: 超過此大小 (KB) 寫入暫存檔,預設 80 KB
  -->
  <httpRuntime 
      maxRequestLength="102400"        <!-- 100 MB -->
      executionTimeout="600"           <!-- 10 分鐘 -->
      requestLengthDiskThreshold="80" 
      useFullyQualifiedRedirectUrl="true"
      minFreeThreads="8"
      minLocalRequestFreeThreads="4"
      appRequestQueueLimit="100"
      enableVersionHeader="false" />
</system.web>

IIS 7+ 額外設定:system.webServer security

<system.webServer>
  <security>
    <requestFiltering>
      <!-- maxAllowedContentLength: 位元組,預設 30000000 (約 28.6 MB) -->
      <requestLimits maxAllowedContentLength="104857600" /> <!-- 100 MB = 100*1024*1024 -->
    </requestFiltering>
  </security>
  
  <!-- 擴大緩衝區避免大檔案截斷 -->
  <aspNetCore 
      requestTimeout="00:10:00" 
      stdoutLogEnabled="false" 
      arguments="" />
</system.webServer>

IIS 6.0 (Windows Server 2003) 設定

  1. IIS 管理員 → 網站屬性 → 主目錄 → 設定 → 限制 → 最大內容長度 設為 104857600 (位元組)。
  2. Metabase.xml 直接編輯:AspMaxRequestEntityAllowed="104857600"。

伺服器記憶體與暫存目錄考量

  • 暫存目錄:ASP.NET 先將上傳檔案寫入 %TEMP%\ASP.NET Files 或 machine.config <processModel tempDirectory=""> 指定路徑。確保磁碟空間充足、NTFS 權限正確(IIS_IUSRS、NETWORK SERVICE 讀寫)。
  • 記憶體壓力:大檔案上傳會佔用 IIS 工作進程記憶體。建議:
    • 啟用 requestLengthDiskThreshold 盡早寫入磁碟。
    • 應用程式集區 回收設定:固定間隔或記憶體限制回收,避免 OOM。
    • 64 位元作業系統 + 64 位元應用程式集區(預設)。

用戶端體驗:進度顯示與斷點續傳

傳統 <input type="file"> 無進度、不支援斷點。現代方案:

方案技術伺服器端支援適用場景
HTML5 File API + XHR2FormData + xhr.upload.onprogress一般 ASP.NET Handler / Web API單檔 < 2GB、現代瀏覽器
Plupload / FineUploader分塊上傳 (Chunked)、多執行緒需實作合併分塊 API大檔案、斷點續傳、資料夾上傳
Resumable.js / tus.io標準化斷點續傳協定 (tus)tusd (Go) 或 ASP.NET Core 實作企業級、跨平台、高可靠
SignalR 進度推播伺服端即時推送進度至客戶端ASP.NET SignalR / ASP.NET Core SignalR即時進度條、多檔佇列

ASP.NET Core 大檔案上傳關鍵設定

// Program.cs / Startup.cs
services.Configure<FormOptions>(options => {
    options.MultipartBodyLengthLimit = 100_000_000; // 100 MB
    options.MemoryBufferThreshold = 81920; // 80 KB 以上寫入磁碟
});

app.UseMiddleware<RequestSizeLimitMiddleware>(); // 或 [RequestSizeLimit(100_000_000)] 屬性

安全性檢查清單

  1. 驗證 Content-Type、副檔名、Magic Number(檔案頭位元組)。
  2. 儲存路徑使用 Path.GetRandomFileName() + 原副檔名,避免路徑遍歷。
  3. 上傳目錄 移除執行權限,設定 web.config 禁止腳本執行:
<configuration>
  <system.webServer>
    <handlers>
      <clear />
      <add name="StaticFile" path="*" verb="*" 
           type="System.Web.StaticFileHandler" 
           resourceType="File" requireAccess="Read" />
    </handlers>
  </system.webServer>
</configuration>

效能調優建議

  • 啟用 IIS 動態壓縮(針對回應),上傳請求不壓縮。
  • 使用 FileStream 非同步讀寫:await file.CopyToAsync(stream) (Core) / BeginRead/EndRead (MVC 5)。
  • 雲端儲存:直接上傳至 Azure Blob / AWS S3 / 阿里雲 OSS(預簽名 URL),減輕應用伺服器頻寬與磁碟 IO。
  • 資料庫僅存儲中繼資料(檔案名、大小、雲端 URL、雜湊值)。

結語

大檔案上傳不只是調大 maxRequestLength,涉及 IIS 管線、記憶體管理、用戶端體驗、安全性、雲端架構等多層面。現代專案建議採用分塊上傳庫(Plupload、Resumable.js)搭配雲端儲存,將應用伺服器轉為協調者而非資料搬運工。

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