首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

.NET 建立檔案下載頁面的標準做法

     編輯:程式設計綜合問答

最簡單方案:靜態連結

若只是提供一個固定的 APK 或任意檔案下載,純 HTML 錨點連結 即可,無需任何後端程式碼:

<a href="files/app-release.apk" download="MyApp_v1.0.apk">下載 APK 安裝檔</a>
  • href:相對或絕對路徑指向伺服器上的實體檔案。
  • download 屬性 (HTML5):建議瀏覽器直接下載而非在新分頁開啟,並可指定下載檔名。
  • 將檔案置於網站根目錄下的 files/ 或 downloads/ 資料夾,確保 IIS/ASP.NET Core 靜態檔案中介軟體啟用。

進階需求:動態生成/權限控管/大檔案傳輸

若需「登入驗證後才能下載」、「動態打包 ZIP」、「支援斷點續傳 (Range Request)」、「記錄下載日誌」,則需撰寫控制器/處理常式:

ASP.NET Core (Controller)

[HttpGet("download/{fileId}")]
public async Task Download(int fileId) {
    var fileMeta = await _fileService.GetMetaAsync(fileId);
    if (fileMeta == null) return NotFound();
    
    var path = _storage.Path(fileMeta.StoredPath);
    if (!System.IO.File.Exists(path)) return NotFound();
    
    // 支援 Range 斷點續傳
    return PhysicalFile(path, "application/octet-stream", fileMeta.OriginalName);
}

ASP.NET WebForms / MVC (傳統)

public ActionResult Download(string id) {
    var path = Server.MapPath("~/App_Data/" + id + ".apk");
    return File(path, "application/vnd.android.package-archive", "app.apk");
}

安全性與效能注意事項

  • 勿直接暴露實體路徑參數: 避免 ?path=../../web.config 類路徑遍歷攻擊,使用資料庫 ID 映射實體路徑。
  • 大檔案使用串流: 避免 File.ReadAllBytes 導致記憶體暴增,ASP.NET Core PhysicalFileResult 內建串流與 Range 支援。
  • 設定正確 MIME: APK 為 application/vnd.android.package-archive,通用二進制用 application/octet-stream。
  • Content-Disposition 標頭: 確保中文檔名正確編碼 (RFC 5987 / URL Encode)。

總結

靜態檔案直連最簡單;動態權控用 Controller 回傳 FileResult/PhysicalFileResult;永遠記得驗證授權、防止路徑遍歷、支援大檔串流。

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