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

C# 實現 Web 文件上傳的兩種經典方案詳解

     編輯:ASP.NET 基礎

前言

文件上傳是 Web 開發中的基礎功能。本文梳理兩種 ASP.NET WebForms 時代的經典實現方式:基於 <input type="file" runat="server"> 的服務端控件上傳,與封裝為獨立類庫的通用上傳組件,並分析其優缺點與現代替代方案。

方案一:服務端控件直傳

1. 前端頁面關鍵點

  • 表單必須設置 enctype="multipart/form-data":
    <form method="post" enctype="multipart/form-data" runat="server">
  • 使用 HTML <input type="file"> 並添加 runat="server" 轉為服務端控件:
    <input id="PreviousFile1" type="file" size="49" runat="server" />

2. 後端處理邏輯

protected void btnUpload_Click(object sender, EventArgs e)
{
    DateTime now = DateTime.Now;
    string basePath = @"D:\web\FC\pic\";

    if (PreviousFile1.PostedFile.ContentLength > 0)
    {
        // 生成唯一文件名:日期 + 文件大小 + 擴展名
        string fileName = $"{now.DayOfYear}{PreviousFile1.PostedFile.ContentLength}.jpg";
        PreviousFile1.PostedFile.SaveAs(basePath + fileName);
        Label1.Text = $"圖片已上傳,文件名:{fileName}";

        // 示例:寫入 XML 記錄(業務擴展)
        // navigator.Insert(...);
    }
}

3. 注意事項

  1. 文件大小限制:默認 4MB,需在 web.config 調整 <httpRuntime maxRequestLength="..." />(單位 KB)。
  2. 目錄權限:IIS 工作進程需對目標目錄有寫入權限。
  3. 路徑問題:安裝包部署時,絕對路徑可能變化,建議用 Server.MapPath 獲取相對路徑。
  4. 重名覆蓋:採用時間戳、GUID 或哈希值生成唯一文件名。

方案二:通用上傳組件類庫

將上傳邏輯封裝為獨立類 FileUpload,支持多文件、自動重命名、元數據記錄、數據庫關聯。

核心代碼結構

public class FileUpload
{
    public enum FileMeta { FILE_SIZE, FILE_POSTNAME, FILE_SYSNAME, FILE_ORGINNAME, FILE_PATH }
    private static Random rnd = new Random();

    public static string[] UploadFile(HtmlInputFile file, string uploadDir)
    {
        if (file.PostedFile.ContentLength <= 0) return null;

        string uniqueName = GetUniqueString();
        string ext = Path.GetExtension(file.PostedFile.FileName).TrimStart('.');
        string originalName = Path.GetFileName(file.PostedFile.FileName);
        string savePath = Path.Combine(uploadDir, $"{uniqueName}.{ext}");

        try { file.PostedFile.SaveAs(savePath); }
        catch { throw; }

        double sizeKB = Math.Round(file.PostedFile.ContentLength / 1024.0, 2);
        return new string[5] {
            sizeKB.ToString(), ext, uniqueName, originalName, savePath
        };
    }

    private static string GetUniqueString()
    {
        // 格式:yyyyMMdd_HHmmss_fff_random
        DateTime dt = DateTime.Now;
        return $"{dt:yyyyMMdd_HHmmss}_{dt.Millisecond:000}_{rnd.Next(1000)}";
    }

    // 簡易數據庫操作輔助(建議改用參數化查詢或 ORM)
    public static bool OperateDB(string sql) { /* ... */ }
}

兩種方案對比

維度方案一:內嵌控件方案二:組件類庫
耦合度高(頁面與邏輯綁定)低(可復用、可測試)
擴展性弱強(支持元數據、DB、多實例)
適用場景簡單頁面、原型開發企業級項目、多模塊復用
維護性差好

現代最佳實踐建議

  • ASP.NET Core / MVC:使用 IFormFile 介面,配合 multipart/form-data 模型綁定。
  • 大文件/斷點續傳:採用分片上傳(如 Plupload、Uppy)+ 服務端合並。
  • 安全性:驗證 MIME 類型、掃描病毒、存儲路徑非 Web 可訪問目錄、文件名清洗。
  • 雲存儲:直接上傳至 OSS/S3/Azure Blob,減輕應用服務器壓力。

總結

從簡單的服務端控件到可復用的組件類庫,反映了 Web 文件上傳架構的演進。理解經典實現有助於維護舊系統,而現代開發應擁抱流式處理、雲原生與安全優先的設計理念。

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