借鑑大佬寫的文章,他這個是圖片的
https://www.jb51.net/javascript/31723515u.htm
業務場景:
後端會給線上檔案地址,然後根據列表點選批次下載
當前存在問題
會有檔案跨域的情況,這個我試過幾個方案都不行,只能遵循同源政策,放一起
外掛安裝
npm install jszip npm install file-saver 我遇到的是,下載依賴會失敗 我的解決方案 npm install file-saver --legacy-peer-deps npm install jszip --legacy-peer-deps
在所需頁面引入
import JSZip from "jszip"; import FileSaver from "file-saver";
檔案JSON展示
const transferData=ref() 如下資料
[ { "fileName": "pH記錄(pH).xlsx", "feilePath": "https://www.baidu.com/mnt/2024/5/9/1788514725233643521.xlsx" }, { "fileName": "pH記錄(pH).xlsx", "feilePath": "https:///www.baidu.com/mnt/2024/5/9/1788514725233643522.xlsx" }, { "fileName": "pH記錄(pH).xlsx", "feilePath": "https:///www.baidu.com/mnt/2024/5/9/1788514725359472642.xlsx" }, { "fileName": "pH記錄(pH).xlsx", "feilePath": "https:///www.baidu.com/mnt/2024/5/9/1788514725359472643.xlsx" }, { "fileName": "pH記錄(pH).xlsx", "feilePath": "https:///www.baidu.com/mnt/2024/5/9/1788514725367861250.xlsx" }, { "fileName": "pH記錄(pH).xlsx", "feilePath": "https:///www.baidu.com/mnt/2024/5/9/1788514725372055553.xlsx" } ]
程式碼展示
const downloadFiles = async () => { // 建立一個新的JSZip例項 const zip = new JSZip(); const now = new Date(); var blogTitle = '全部檔案'; var promises = []; // 假設你有一個檔案列表 // 遍歷檔案列表,下載並新增到ZIP檔案中 for (const item of transferData.value) { if (item.feilePath) { const promise = getImgArrayBuffer(item.feilePath).then((data) => { // 下載檔案, 並存成ArrayBuffer物件(blob) zip.file(item.fileName, data, {binary: true}); // 逐個新增檔案 cache[item.fileName] = data; }); promises.push(promise); } else { // feilePath地址不存在時提示 console.log(`附件${item.fileName}地址錯誤,下載失敗`); } } debounceTimeout = setTimeout(() => { zip.generateAsync({type: "blob"}).then((content) => { // 生成二進位制流 FileSaver.saveAs(content, blogTitle); // 利用file-saver儲存檔案 blogTitle:自定義檔名 }); }, 100 * transferData.value.length); // 在實際的測試中,Promise會執行壓縮失敗,試過幾次,特別的檔案很多的情況下,然後就用了個很挫的解決方案,反正解決了 } //檔案以流的形式獲取(引數url為檔案連結地址) const getImgArrayBuffer = (url) => { return new Promise((resolve, reject) => { //透過請求獲取檔案blob格式 let xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", url, true); xmlhttp.responseType = "blob"; xmlhttp.onload = function () { if (xmlhttp.status == 200) { resolve(xmlhttp.response); } else { console.log('下載失敗====', xmlhttp.response) reject(xmlhttp.response); } }; xmlhttp.send(); }); }