项目需求:将多个文件/图片导出为一个zip格式压缩包,点击<下载全部附件>按钮下载上面三个文件
1、安装jszip和file-saver插件
npm install jszip
npm install file-saver
2、在所需页面引入
import JSZip from "jszip";import FileSaver from "file-saver";
3、模拟fileList数组
//fileList模拟文件数组export default {name: "notice-list",data() {return {fileList: [{fileName: '3.jpg',feilePath: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'},{fileName: '5.jpg',feilePath: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'},{fileName: '测试2.doc',feilePath: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'}],}}
}
4、 在methods中定义方法
// 下载全部附件 downloadBtn<下载全部附件>按钮绑定事件downloadBtn() {var blogTitle = `全部附件`; // 下载后压缩包的名称var zip = new JSZip();var promises = [];let cache = {};for (let item of this.fileList) {// item.feilePath为文件链接地址// item.fileName为文件名称if(item.feilePath) {const promise = this.getImgArrayBuffer(item.feilePath).then((data) => {// 下载文件, 并存成ArrayBuffer对象(blob)zip.file(item.fileName, data, { binary: true }); // 逐个添加文件cache[item.fileName] = data;});promises.push(promise);} else {// feilePath地址不存在时提示alert(`附件${item.fileName}地址错误,下载失败`);}}Promise.all(promises).then(() => {zip.generateAsync({ type: "blob" }).then((content) => {// 生成二进制流FileSaver.saveAs(content, blogTitle); // 利用file-saver保存文件 blogTitle:自定义文件名});}).catch((res) => {alert("文件压缩失败");});},//文件以流的形式获取(参数url为文件链接地址)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 {reject(xmlhttp.response);}};xmlhttp.send();});},
5、复制粘贴可用,看过其它教程有一部分版本都是存在错误的,所以修改了一部分