特性速覽
- 鏈式配置 API(
SetFileDirectory、SetFileType 等)。
- 兩種子目錄策略:按日期(
yyyy-MM/dd)或按業務編號。
- 同名檔案可選重命名或覆蓋。
- 檔案類型白名單(支援
* 全許可)、大小限制。
- 返回結構化結果(
Error、WebFilePath、FileName 等)。
調用示例
var uf = new UploadFile()
.SetFileDirectory(Server.MapPath("/file/temp3/"))
.SetFileType(".jpg,.png,.pdf")
.SetMaxSizeM(5)
.SetIsRenameSameFile(true);
// 按日期存儲
var msg1 = uf.Save(Request.Files["Fileupload1"]);
// 按業務編號存儲
var msg2 = uf.Save(Request.Files["Fileupload1"], "ORDER_20240101");
if (!msg1.Error) { /* 成功:msg1.WebFilePath */ }
核心實現亮點
1. 靈活的存儲路徑解析
private string GetDirectory(ref string webDir)
{
var childDir = PathSaveType == PathSaveType.dateTimeNow
? DateTime.Now.ToString("yyyy-MM/dd")
: _Number; // 業務編號
webDir = $"{FileDirectory.TrimEnd('/')}/{childDir}/";
var physDir = HttpContext.Current.Server.MapPath(webDir);
if (!Directory.Exists(physDir)) Directory.CreateDirectory(physDir);
return physDir;
}
2. 安全的類型驗證
private void CheckingType(ResponseMessage msg, string fileName)
{
if (FileType != "*")
{
var ext = Path.GetExtension(fileName).ToLowerInvariant();
if (!FileType.Split(',').Contains(ext))
TryError(msg, "文件類型非法!");
}
}
3. 結構化返回模型
public class ResponseMessage
{
public bool Error { get; set; }
public string Message { get; set; }
public string FilePath { get; set; } // 物理路徑
public string WebFilePath { get; set; } // 相對 Web 路徑
public string FileName { get; set; }
}
使用建議
- 生產環境請將上傳目錄設置為不可執行權限,防止腳本攻擊。
- 大文件建議改用分片上傳或直傳雲存儲(OSS/S3),避免阻塞 Web 線程。
- 配合前端 Plupload/WebUploader 實現進度條、斷點續傳。