在前端實現下載 ZIP 包到本地,通常有以下幾種方法,具體取決于 ZIP 包的來源(靜態文件、后端生成、前端動態生成等):
方法 1:直接下載靜態文件(最簡單)
如果 ZIP 包是服務器上的靜態文件,可以直接通過 <a>
標簽的 download
屬性實現下載。
<a href="/path/to/yourfile.zip" download="filename.zip">點擊下載</a>
或通過 JavaScript 動態觸發:
const link = document.createElement('a');
link.href = '/path/to/yourfile.zip';
link.download = 'filename.zip';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
方法 2:從后端獲取文件流(Blob)
如果 ZIP 包由后端動態生成并通過接口返回,可以使用 fetch
或 XMLHttpRequest
獲取文件流,再通過 Blob 下載。
示例代碼(使用 fetch):
fetch('/api/download-zip').then(response => response.blob()).then(blob => {const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'filename.zip'; // 設置文件名a.click();window.URL.revokeObjectURL(url); // 釋放內存});
示例代碼(使用 XMLHttpRequest):
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/download-zip', true);
xhr.responseType = 'blob';xhr.onload = function() {if (xhr.status === 200) {const blob = xhr.response;const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'filename.zip';a.click();window.URL.revokeObjectURL(url);}
};xhr.send();
方法 3:前端動態生成 ZIP 包(需第三方庫)
如果需要在瀏覽器中動態生成 ZIP 文件,可以使用 JSZip 庫。
示例代碼:
- 安裝依賴:
npm install jszip file-saver
- 前端代碼:
import JSZip from 'jszip';
import { saveAs } from 'file-saver';// 創建 ZIP 實例
const zip = new JSZip();// 向 ZIP 中添加文件(示例:文本文件)
zip.file('hello.txt', 'Hello World!');// 添加圖片(假設圖片通過 fetch 獲取)
fetch('/path/to/image.png').then(response => response.blob()).then(blob => {zip.file('image.png', blob);return zip.generateAsync({ type: 'blob' });}).then(content => {saveAs(content, 'archive.zip'); // 使用 file-saver 保存文件});
注意事項
-
文件名問題:
- 后端需設置響應頭
Content-Disposition: attachment; filename="filename.zip"
,確保瀏覽器正確識別文件名。 - 前端動態生成時,通過
a.download = 'filename.zip'
指定文件名。
- 后端需設置響應頭
-
跨域問題:
- 如果文件在不同域,需配置 CORS 或使用代理。
-
大文件處理:
- 大文件下載需考慮分片或進度提示(如
axios
的onDownloadProgress
)。
- 大文件下載需考慮分片或進度提示(如
-
瀏覽器兼容性:
download
屬性在 IE 和部分移動端瀏覽器中不兼容,需降級處理(如直接打開鏈接)。
根據實際場景選擇合適的方法!