ASP.NET 預設限制上傳 4MB,大檔案上傳需調整 Web.config、IIS 要求限制、應用程式集區設定,並考慮斷點續傳、進度顯示、記憶體壓力等工程化課題。本文提供完整設定清單與最佳實踐。
<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>
<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>
104857600 (位元組)。AspMaxRequestEntityAllowed="104857600"。%TEMP%\ASP.NET Files 或 machine.config <processModel tempDirectory=""> 指定路徑。確保磁碟空間充足、NTFS 權限正確(IIS_IUSRS、NETWORK SERVICE 讀寫)。requestLengthDiskThreshold 盡早寫入磁碟。傳統 <input type="file"> 無進度、不支援斷點。現代方案:
| 方案 | 技術 | 伺服器端支援 | 適用場景 |
|---|---|---|---|
| HTML5 File API + XHR2 | FormData + 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 | 即時進度條、多檔佇列 |
// 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)] 屬性
Content-Type、副檔名、Magic Number(檔案頭位元組)。Path.GetRandomFileName() + 原副檔名,避免路徑遍歷。web.config 禁止腳本執行:<configuration>
<system.webServer>
<handlers>
<clear />
<add name="StaticFile" path="*" verb="*"
type="System.Web.StaticFileHandler"
resourceType="File" requireAccess="Read" />
</handlers>
</system.webServer>
</configuration>
FileStream 非同步讀寫:await file.CopyToAsync(stream) (Core) / BeginRead/EndRead (MVC 5)。大檔案上傳不只是調大 maxRequestLength,涉及 IIS 管線、記憶體管理、用戶端體驗、安全性、雲端架構等多層面。現代專案建議採用分塊上傳庫(Plupload、Resumable.js)搭配雲端儲存,將應用伺服器轉為協調者而非資料搬運工。