VUE3+jszip和file-saver如何实现下载多个文件导出为一个zip格式
借鉴大佬写的文章,他这个是图片的
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();
});
}

浙公网安备 33010602011771号