项目需求:

将多个文件导出为一个zip格式压缩包,点击<批量下载>按钮下载选中的几个文件

1、安装jszip和file-saver插件

npm install jszip
npm install file-saver

2、在所需页面引入

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

3、模拟fileList数组

[
    {
        "answerName": "名字1",
        "answer": "https://地址1"
    },
    {
        "answerName": "名字2",
        "answer": “https://地址2"
    }
]

4、在methods中定义方法

// 下载全部附件   downloadBtn<下载全部附件>按钮绑定事件
      downloadBtn() {
        var blogTitle = `学生答案批量下载`; // 下载后压缩包的名称
        var zip = new JSZip();
        var promises = [];
        let cache = {};
        for (let item of this.fileList) {
          // item.answer为文件链接地址
          // item.answerName为文件名称
          if (item.answer) {
            const promise = this.getImgArrayBuffer(item.answer).then((data) => {
              // 下载文件, 并存成ArrayBuffer对象(blob)
              zip.file(item.answerName, data, {
                binary: true
              }); // 逐个添加文件
              cache[item.answerName] = data;
            });
            promises.push(promise);
          } else {
            // answer地址不存在时提示
            alert(`附件${item.answerName}地址错误,下载失败`);
          }
        }
        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();
        });
      },

以上为全部代码,缺点是有一定的等待下载时间,这个需要后续的处理

我在按钮的地方添加了一个loading特效来处理的

<el-button type="primary" size="small" @click="downloadBtn" :loading="btnloading">
   {{ btnloading ? '下载中...' : '批量下载' }}
</el-button>

GitHub 加速计划 / vu / vue
108
18
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
9e887079 [skip ci] 1 年前
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐