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、复制粘贴可用,看过其它教程有一部分版本都是存在错误的,所以修改了一部分

猜你喜欢

转载自blog.csdn.net/DevelopmentW/article/details/128236859
今日推荐