vue前端导出zip包

需求:将多个文件打包成zip压缩包下载的功能

以下是后台返回的需要下载的文件的数据结构:

//zipName是zip压缩包的名字,fileUrl是需要下载的文件地址,fileName是文件的名称

复制代码
{
    "status": 1,
    "message": "导出成功",
    "data": {
        "zipName": "全部简历.zip",
        "filesArr": [ {
            "fileUrl": "https://xxxxxx",
            "fileName": "张亮的简历.pdf"
        }, {
            "fileUrl": "https://xxxxxx",
            "fileName": "小明的简历.pdf"
        }, {
            "fileUrl": "https://xxxxxx",
            "fileName": "张三.pdf"
        }]
    }
}
复制代码

 

第一步:下载插件

//jszip是一个用于创建、读取和编辑.zip文件的JavaScript库 可以将文件或者图片打包成一个Zip文件。
npm install jszip

//前端下载, 基于Blob进行下载,
npm install file-saver

 

第二步:在需要用以上插件的页面中引入:

import JSZip from "jszip";
import FileSaver from "file-saver";

 

第三步:调用代码

复制代码
     /***
       * 文件打包
       * filesArr: 需要打包的数据集合:[{fileUrl:文件url, fileName:文件名}]
       * fileName: 压缩包名称
       */
      filesToRar(filesArr, zipName) {
        let _this = this;
        let zip = new JSZip();
        let cache = {};
        let promises = [];
        _this.title = "正在加载压缩文件";
        this.loading = true;
        this.loadingText = _this.title;
        for (let i = 0, len = filesArr.length; i < len; i++) {
          let item = filesArr[i];
          const promise = _this.getFileArrayBuffer(item.fileUrl).then((data) => {
            // 下载文件, 并存储为ArrayBuffer对象(blob)
            // 逐个添加文件
            zip.file(item.zipName, data, { binary: true });
            cache[item.zipName] = data;
            this.loadingText = _this.title + "  " + filesArr.length + " / " + i;
          });
          promises.push(promise);
        }

        Promise.all(promises)
          .then(() => {
            zip.generateAsync({ type: "blob" }).then((content) => {
              _this.title = "正在压缩";
              this.loadingText = _this.title;
              // 生成二进制流
              // 利用file-saver保存文件,自定义文件名
              FileSaver.saveAs(content, fileName);
              _this.title = "压缩完成";
              this.loadingText = _this.title;
              this.loading = false;
            });
          })
          .catch((res) => {
            this.loading = false;
            _this.$message.error("文件压缩失败");
          });
      },





// 获取文件blob getFileArrayBuffer(url) { let _this = this; return new Promise((resolve, reject) => { // 通过请求获取文件blob格式 let xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", url, true); xmlhttp.responseType = "blob"; xmlhttp.onload = function () { if (this.status == 200) { resolve(this.response); } else { reject(this.status); } }; xmlhttp.send(); }); },
复制代码

 

posted @   最初的样子  阅读(2887)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示