【vue】vue项目中批量下载文件并打压缩包

前言

一开始用的是循环单个文件下载,即从后台获取到文件url列表,循环对每个url单独进行下载,这样的问题是每调用一次下载,浏览器都会进行"另存为"的弹框,很麻烦!!!

关闭"下载前询问每个文件的保存位置",又不是我想要的,这样就不提示保存位置,直接下载到浏览器的默认位置。而且按网上的方法,在程序代码里不让它弹"另存为"的弹框,也不起作用(具体方法放到了参考文章中)。

所以就产生了批量下载并打压缩包的想法。

解决方法

1、下载插件

javascript 复制代码
npm install jszip
npm install file-saver

注: install完成后,会自动在package-lock.json和package.json中,添加上所需依赖。

2、在vue文件中使用

javascript 复制代码
import JSZip from 'jszip'
import FileSaver from 'file-saver'

3、下载文件以及打包方法

javascript 复制代码
    /**文件打包* arrImages:文件list:[{fileUrl:文件url,renameFileName:文件名}]* filename 压缩包名* */
    filesToRar(arrImages, filename) {
      let _this = this;
      let zip = new JSZip();
      let cache = {};
      let promises = [];
      _this.title = '正在加载压缩文件';
      const loading = this.$loading({lock: true,text: '正在加载压缩文件',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)'});
      console.log("aaaa",arrImages);
      for (let item of arrImages) {
        console.log("item",item)
        // 下载文件, 并存成ArrayBuffer对象
        const promise = this.getImgArrayBuffer(item.fileStaticUrl).then(data => { 
          // 获取文件名
          const file_name = encodeURIComponent(item.fileId) 
          // 逐个添加文件
          zip.file(file_name, data, { binary: true })           
          cache[file_name] = data})
          promises.push(promise);
        }
        Promise.all(promises)
        // 生成二进制流
        .then(() => {zip.generateAsync({ type: "blob" })
          .then(content => {_this.title = '正在压缩';
            // 利用file-saver保存文件  自定义文件名
            FileSaver.saveAs(content, filename);             
            _this.title = '压缩完成';}
          );
          loading.close();
        }).catch(res=>{
          _this.$message.error('文件压缩失败');
          loading.close();
        });
    },
javascript 复制代码
   getImgArrayBuffer(url) {
      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();
      });
    },

4.获取文件url列表

javascript 复制代码
    getFileUrls() {     
      this.$http({
        url: this.$http.adornUrl("/fileSystemApi/fileInfo/batch/download"),
        method: "post",
        data: {
          fileInfoList: this.dataListSelections,
          updateBy: this.$cookie.get('username')
        },
      }).then(({ data }) => {
        console.log("getFileUrls",data)
        this.fileInfoList = data.data.fileInfoList;
        console.log("sd",this.fileInfoList) 
        this.filesToRar(this.fileInfoList, this.getTimestamp());
      });
    },

获取的fileInfoList即第3步中的arrImages,时间戳当做压缩包的文件名

5.在data中定义变量

javascript 复制代码
data() {
    return {
      dataForm: {
        id: "",
        bucketId: "",
        fileId: "",
        fileType: "",
        syscode: "",
        fileCustno: "",
        createTime: "",
      },
      dataList: [],
      dataListSelections: [], // 选中数据
      dataIdListSelections: [], // 选中id
      dataListLoading: false,
      currPage: 1,
      pageSize: 10,
      totalCount: 0,
      url: "",
      fileInfoList: "",
      dialogVisible: false,
    };
  },

6.点击按钮

html 复制代码
<template>
  <div>
    <!-- 省略其他... -->
    <el-form
      :inline="true"
      :model="dataForm"
      @keyup.enter.native="getDataList()"
    >
      <el-form-item>
        <el-button type="primary" @click="getFileUrls()">批量下载</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

参考文章

https://blog.csdn.net/qq_47498423/article/details/131191964

http://www.taodudu.cc/news/show-5240586.html?action=onClick

https://code84.com/821872.html

http://www.taodudu.cc/news/show-4791614.html?action=onClick

循环单个文件下载的方式

https://blog.csdn.net/qq_41131745/article/details/128861548

https://blog.csdn.net/qq_42840904/article/details/131582093

https://ask.csdn.net/questions/7733361

https://blog.csdn.net/weixin_52268321/article/details/130465839

https://www.5axxw.com/questions/simple/qq469i

https://blog.csdn.net/weixin_43227235/article/details/130227361

相关推荐
weixin_382395234 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__4 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.5 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~6 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子9 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅9 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni10 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学11 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端