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

ASP.NET FileUpload 上傳大檔案完整設定指南

     編輯:ASP.NET 基礎

ASP.NET 預設限制上傳檔案大小為 **4 MB**,超過會拋出例外。本文說明如何修改 `Web.config` 突破限制,並提供完整上傳程式碼範例與關鍵注意事項。

一、修改 Web.config 解除大小限制


<system.web>
    <!-- 
        maxRequestLength:最大請求長度(單位:KB),預設 4096 (4MB)
        executionTimeout:請求執行逾時(單位:秒),預設 110 秒
    -->
    <httpRuntime maxRequestLength="40960" executionTimeout="6000" />
</system.web>

上例將上傳上限設為 **40 MB**(40960 KB),逾時設為 **6000 秒**(100 分鐘),適合大檔案上傳。

IIS 7+ 額外設定(若仍失敗)


<system.webServer>
    <security>
        <requestFiltering>
            <!-- maxAllowedContentLength:單位為 Bytes,預設 30000000 (~28.6MB) -->
            <requestLimits maxAllowedContentLength="41943040" /> <!-- 40 MB -->
        </requestFiltering>
    </security>
</system.webServer>

二、完整上傳程式碼範例

前端:Default.aspx


<asp:FileUpload ID="fulFileName" runat="server" />
<asp:TextBox ID="txtFileName" runat="server" placeholder="自訂檔名(不含副檔名)" />
<asp:Button ID="btnSend" Text="上傳" OnClick="btnSend_Click" runat="server" />
<asp:Label ID="lblResult" runat="server" />

後端:Default.aspx.cs


protected void btnSend_Click(object sender, EventArgs e)
{
    try
    {
        if (!fulFileName.HasFile)
        {
            lblResult.Text = "請先選擇檔案";
            return;
        }

        // 1. 取得原始檔名與副檔名
        string originalName = fulFileName.FileName; // 瀏覽器可能只回傳檔名,不含路徑
        string extension = Path.GetExtension(originalName); // 含點號,如 ".pdf"

        // 2. 組合新檔名(使用者輸入 + 原副檔名)
        string newFileName = txtFileName.Text.Trim() + extension;
        if (string.IsNullOrWhiteSpace(txtFileName.Text))
        {
            newFileName = originalName; // 未輸入則保留原名
        }

        // 3. 目標儲存路徑(專案根目錄下的 File 資料夾)
        string folderPath = Server.MapPath("~/File/");
        if (!Directory.Exists(folderPath))
        {
            Directory.CreateDirectory(folderPath); // 自動建立資料夾
        }

        string fullPath = Path.Combine(folderPath, newFileName);

        // 4. 儲存檔案
        fulFileName.PostedFile.SaveAs(fullPath);

        lblResult.Text = $"上傳成功:{newFileName} ({fulFileName.PostedFile.ContentLength} bytes)";
    }
    catch (Exception ex)
    {
        lblResult.Text = "上傳失敗:" + ex.Message;
        // 建議記錄完整堆疊至 Log
    }
}

三、關鍵步驟解析

  1. HasFile 檢查:避免未選檔案直接送出導致 NullReference。
  2. Path.GetExtension:安全取得副檔名,含點號,不需手動 `LastIndexOf`。
  3. Server.MapPath("~/File/"):`~` 代表應用程式根目錄,比 `"./"` 更可靠。
  4. Directory.CreateDirectory:確保目標資料夾存在,避免 `DirectoryNotFoundException`。
  5. Path.Combine:跨平台安全路徑組合,自動處理分隔符號。
  6. PostedFile.SaveAs:核心儲存方法,串流寫入磁碟。

四、大檔案上傳進階建議

  • 分塊上傳:前端以 Blob 切片,後端合併,可突破單一請求大小限制並支援續傳。
  • 串流處理:使用 `PostedFile.InputStream` 逐段讀寫,避免大檔案完全載入記憶體。
  • 非同步上傳:搭配 `async/await` 或 `IHttpAsyncHandler` 提升伺服器併發能力。
  • 檔案類型驗證:檢查 `ContentType` 與副檔名,防止惡意檔案上傳。
  • 病毒掃描:整合 ClamAV 或雲端掃描 API,保障伺服器安全。

五、常見錯誤排查

錯誤現象可能原因解決方向
HTTP 404.13 / 最大內容長度超過IIS `maxAllowedContentLength` 太小設定 `system.webServer/security/requestFiltering/requestLimits`
HTTP 500 / 逾時`executionTimeout` 過短增加 `httpRuntime executionTimeout`
儲存失敗:存取被拒資料夾寫入權限不足授予 IIS_IUSRS / AppPool Identity 寫入權限
檔名亂碼瀏覽器編碼差異使用 `HttpUtility.UrlDecode` 或 Guid 重命名

正確配置 `maxRequestLength` 與 `maxAllowedContentLength`,搭配健全的後端儲存邏輯,即可在 ASP.NET Web Forms 中穩定支援大檔案上傳。

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