因需要解压PDF文件并且实现批量下载,但网上找到的基本都是图片的解压和下载,所以参考图片的解压修改了一下。
用到了jszip,jszip-utils,file-saver这三个依赖
下面进入正题
async unZipHandle(arr) {
// arr为需要解压的数组
let zip = new JSZip();
let promises = []; // 存放解压的文件
let that = this;
// 这里用await就是为了改成同步,需要等数据处理完才进行下一步
await arr.forEach((item) => {
let promise = that
.getUrlBuffer(item)
.then((pdf) => {
// getUrlBuffer这里是把url解压转化成文件
for (let key in pdf.files) {
// 判断是否是目录
if (!pdf.files[key].dir) {
if (/\.(pdf)$/.test(pdf.files[key].name)) {
// 这里判断是pdf文件,其他文件的话,换个格式
return pdf
.file(pdf.files[key].name)
.async("ArrayBuffer")
.then((data) => {
// 把文件转化为buffer
// this.arrayBufferToBlob(data);这个是因为pdf需要展示,所以我这边把buffer转化成blob文件会得到个url,方便用来展示。后面会补充这个方法
// return出buffer生成的文件
return zip.file(pdf.files[key].name, data, {
binary: true,
});
});
}
}
}
// zip.file("测试", pdf, { binary: true });
});
// 将循环得到的所有promise存到一个数组里面
promises.push(promise);
});
Promise.all(promises) // this.policyNo
.then((res) => {
// 这里就简单了,当所有promise执行完之后,打包下载
zip
.generateAsync({
type: "blob",
})
.then((content) => {
// zipName这个是压缩包名称,可以自己定义
FileSaver.saveAs(content, zipName);
});
});
}
getUrlBuffer(url) {
// zip解压成源文件的方法
return new JSZip.external.Promise(function (resolve, reject) {
JSZipUtils.getBinaryContent(url, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
}).then(function (data) {
return JSZip.loadAsync(data);
});
}
arrayBufferToBlob(arrayBuffer) { // 为了得到文件临时的url
return URL.createObjectURL(
new Blob([arrayBuffer], { type: "application/pdf" }) // 不加type会乱码
);
},
上面的解压方法内包含了文件的解压,转化arrayBuffer以及Blob(转Blob是因为临时展示文件不需要的同学可以忽略)循环解压一定要改成同步,不然数据处理会有问题。
喜欢的同学,可以点个赞再走,谢谢了!