第一步下载包
npm i jszip save-as-file -S
第二步引入包
import JSZip from "jszip";
import saveFile from "save-as-file";
第三步使用
const zip = new JSZip();
const cache = {};
const promises = [];
batchDownLoadZip(
[
"http://xxx.jpg",
"http://xxx.png",
],
"压缩文件名称"
);
function batchDownLoadZip(fileList, zipName) {
return new Promise((resolve, reject) => {
fileList.forEach((item, index) => {
// item.fileUrl.split('?')[0] 处理fileList里的url地址 去除?号和后面的字符串
const promise = getImgArrayBuffer(item.split("?")[0])
.then((data) => {
// 下载文件, 并存成ArrayBuffer对象
// item.fileName fileList里的文件名
zip.file(index + ".png", data, { binary: true }); // 逐个添加文件
cache[item.fileName] = data; // 可要可不要 用来打印查检查添加了那些文件
})
.catch((e) => {
console.log("文件访问失败");
});
promises.push(promise); // 加到promises队列里
});
Promise.all(promises)
.then(() => {
// 异步队列全部完成时 执行下面代码
console.log("开始压缩");
zip
.generateAsync({ type: "blob" })
.then((content) => {
// 生成二进制流
console.log("压缩成功", content);
saveFile(content, zipName);
console.log("文件保存成功");
resolve();
})
.catch((e) => {
console.log("下载失败");
reject(e);
});
})
.catch((e) => {
console.log("压缩失败");
reject(e);
});
});
}
function getImgArrayBuffer(href) {
return new Promise((resolve, reject) => {
// 通过请求获取文件blob格式
const xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", href, true);
xmlhttp.responseType = "blob";
xmlhttp.onload = function() {
if (this.status === 200) {
resolve(this.response);
} else {
reject(this.status);
}
};
xmlhttp.send();
});
}