当前位置:   article > 正文

VUE 如何实现多个文件导出为一个zip格式并下载_vue下载zip文件

vue下载zip文件

项目需求:

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

1、安装jszip和file-saver插件

  1. npm install jszip
  2. npm install file-saver

2、在所需页面引入

  1. import JSZip from "jszip";
  2. import FileSaver from "file-saver";

3、模拟fileList数组

  1. [
  2. {
  3. "answerName": "名字1",
  4. "answer": "https://地址1"
  5. },
  6. {
  7. "answerName": "名字2",
  8. "answer": “https://地址2"
  9. }
  10. ]

4、在methods中定义方法

  1. // 下载全部附件 downloadBtn<下载全部附件>按钮绑定事件
  2. downloadBtn() {
  3. var blogTitle = `学生答案批量下载`; // 下载后压缩包的名称
  4. var zip = new JSZip();
  5. var promises = [];
  6. let cache = {};
  7. for (let item of this.fileList) {
  8. // item.answer为文件链接地址
  9. // item.answerName为文件名称
  10. if (item.answer) {
  11. const promise = this.getImgArrayBuffer(item.answer).then((data) => {
  12. // 下载文件, 并存成ArrayBuffer对象(blob)
  13. zip.file(item.answerName, data, {
  14. binary: true
  15. }); // 逐个添加文件
  16. cache[item.answerName] = data;
  17. });
  18. promises.push(promise);
  19. } else {
  20. // answer地址不存在时提示
  21. alert(`附件${item.answerName}地址错误,下载失败`);
  22. }
  23. }
  24. Promise.all(promises).then(() => {
  25. zip.generateAsync({
  26. type: "blob"
  27. }).then((content) => {
  28. // 生成二进制流
  29. FileSaver.saveAs(content, blogTitle); // 利用file-saver保存文件 blogTitle:自定义文件名
  30. });
  31. }).catch((res) => {
  32. alert("文件压缩失败");
  33. });
  34. },
  35. //文件以流的形式获取(参数url为文件链接地址)
  36. getImgArrayBuffer(url) {
  37. return new Promise((resolve, reject) => {
  38. //通过请求获取文件blob格式
  39. let xmlhttp = new XMLHttpRequest();
  40. xmlhttp.open("GET", url, true);
  41. xmlhttp.responseType = "blob";
  42. xmlhttp.onload = function() {
  43. if (xmlhttp.status == 200) {
  44. resolve(xmlhttp.response);
  45. } else {
  46. reject(xmlhttp.response);
  47. }
  48. };
  49. xmlhttp.send();
  50. });
  51. },

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/901772
推荐阅读
相关标签
  

闽ICP备14008679号