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

C# 實現 Web 檔案上傳的兩種方法:基礎表單與封裝元件

     編輯:關於C#

Web 檔案上傳核心需求

將本地檔案上傳至伺服器,供使用者瀏覽下載,是 Web 應用常見功能。ASP.NET 提供 FileUpload 控制項與 HttpPostedFile 類別支援。

方法一:基礎 Web Form 實作

關鍵設定

  1. 表單必須設定 enctype="multipart/form-data" 與 method="post",否則無法上傳。
  2. 工具箱選擇 HTML 類別的 File Field(<input type="file">),並加上 runat="server" 變為伺服器控制項。

上傳按鈕程式碼

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

    if (uploadFile1.PostedFile.ContentLength > 0)
    {
        string fileName = now.DayOfYear.ToString() + 
                          uploadFile1.PostedFile.ContentLength.ToString() + ".jpg";
        uploadFile1.PostedFile.SaveAs(basePath + fileName);
        lblMessage.Text = "圖片已上傳:" + fileName;

        // 寫入 XML 記錄(專案特定需求)
        // navigator.Insert(...);
    }
}

注意事項

  • 限制上傳檔案大小(web.config 設定 maxRequestLength)。
  • 配置 IIS 執行身分的寫入權限。
  • 部署時注意絕對路徑對應。
  • 避免檔名衝突(以時間+大小命名或 GUID)。

方法二:封裝可重用的 FileUpload 元件

適用於企業級專案,支援多種檔案類型、資料庫記錄、隨機檔名生成。

核心類別結構

public class FileUpload
{
    public enum FileInfo { FILE_SIZE, FILE_POSTNAME, FILE_SYSNAME, FILE_ORGINNAME, FILE_PATH }

    private static Random rnd = new Random();

    public static string[] UploadFile(HtmlInputFile file, string uploadDir)
    {
        // 1. 驗證檔案
        if (file.PostedFile.ContentLength <= 0) return null;

        // 2. 產生唯一檔名:yyyyMMdd_HHmmss_fff_隨機數
        string sysName = GetUniqueFileName();
        string ext = Path.GetExtension(file.PostedFile.FileName).TrimStart('.');
        string origName = Path.GetFileName(file.PostedFile.FileName);

        // 3. 儲存實體檔案
        string fullPath = Path.Combine(uploadDir, sysName + "." + ext);
        file.PostedFile.SaveAs(fullPath);

        // 4. 計算檔案大小 (KB)
        double sizeKB = Math.Round(file.PostedFile.ContentLength / 1024.0, 2);

        // 5. 回傳資訊陣列
        return new string[] 
        { 
            sizeKB.ToString(), ext, sysName, origName, fullPath 
        };
    }

    public static bool ExecuteSql(string sql) { /* ADO.NET 執行 SQL */ }

    private static string GetUniqueFileName()
    {
        DateTime dt = DateTime.Now;
        return $"{dt:yyyyMMdd_HHmmss_fff}_{rnd.Next(1000)}";
    }
}

使用方式

string[] info = FileUpload.UploadFile(uploadControl, @"D:\Uploads\");
if (info != null)
{
    // info[0] 大小, info[1] 副檔名, info[2] 系統檔名, info[3] 原始檔名, info[4] 完整路徑
    FileUpload.ExecuteSql($"INSERT INTO Files VALUES ('{info[2]}', '{info[3]}', ...)");
}

第二種方法結構清晰、擴充性強,建議專案採用元件化設計。

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