文件上傳是 Web 開發中的基礎功能。本文梳理兩種 ASP.NET WebForms 時代的經典實現方式:基於 <input type="file" runat="server"> 的服務端控件上傳,與封裝為獨立類庫的通用上傳組件,並分析其優缺點與現代替代方案。
enctype="multipart/form-data":<form method="post" enctype="multipart/form-data" runat="server"><input type="file"> 並添加 runat="server" 轉為服務端控件:<input id="PreviousFile1" type="file" size="49" runat="server" />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(...);
}
}
web.config 調整 <httpRuntime maxRequestLength="..." />(單位 KB)。Server.MapPath 獲取相對路徑。將上傳邏輯封裝為獨立類 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、多實例) |
| 適用場景 | 簡單頁面、原型開發 | 企業級項目、多模塊復用 |
| 維護性 | 差 | 好 |
IFormFile 介面,配合 multipart/form-data 模型綁定。從簡單的服務端控件到可復用的組件類庫,反映了 Web 文件上傳架構的演進。理解經典實現有助於維護舊系統,而現代開發應擁抱流式處理、雲原生與安全優先的設計理念。