VUE+jszip如何实现下载多个文件导出为一个zip格式
作者:前端小小白~
这篇文章主要介绍了VUE+jszip如何实现下载多个文件导出为一个zip格式方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
VUE+jszip下载多个文件导出为一个zip格式
项目需求:
将多个文件/图片导出为一个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、复制粘贴可用
看过其它教程有一部分版本都是存在错误的,所以修改了一部分
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。