VUE2 批量下載文件,保存為zip

本文章是利用jszipfile-saver,將文件逐个压缩后,生成二进制流,利用file-saver保存文件,文件名自定义,废话不多说,开干!

一、Html

<el-button type="text" @click="handleBatchdownload()">
     <i class="el-icon-download" style="padding-right: 2px;font-size: 16px;"></i>批量下載
</el-button>

二、JS:

1. 安装jszip和file-saver第三方包

 npm install jszip
 npm install file-saver

2.引入包

import JSZip from 'jszip';
import { saveAs } from 'file-saver';

3.编写函数handleBatchdownload

批量下载前确认提示,此处用this.multipleSelection为数据来源(el-table多选事件,不过多赘述,自行查看官方文档)

handleBatchdownload() {
    if(this.multipleSelection.length==0) return     
    this.$message.warning('请勾选需要下载的文件')
        this.$confirm('确定要下载全部文件?', '确认下载', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }).then(() => {
            this.batchDownload(); //用jszip和file-saver第三方包
        }).catch(() => {})
    },

压缩转二进制流函数  this.batchDownload()

batchDownload() {
    const zip = new JSZip();
    // 下载后压缩包的名称
    const blogTitle = 'file.zip' 
    const cache = {};
    const promises = [];
    this.multipleSelection.forEach(item => {
        if (item.fileId) {
            var url = this.fileBaseUrl + '/download/' + item.fileId
            const promise = this.getFile(url).then(data => {
            // *下载文件, 并存成ArrayBuffer对象
                 const arr_name = item.fileName.split("/");
                 const file_name = arr_name[arr_name.length - 1]; // *获取文件名
                  zip.file(file_name, data, { binary: true }); // *逐个添加文件
                    cache[file_name] = data;
              });
            promises.push(promise);
         } 
    });
    Promise.all(promises).then(() => {
        zip.generateAsync({
            type: "blob", compression: 'DEFLATE',  // *STORE: 默认不压缩; DEFLATE:需要压缩
            compressionOptions: {
                level: 9 // *压缩等级 1~9。1: 压缩速度最快,9: 最优压缩方式
            }
        }).then(content => {
            saveAs(content, blogTitle); // *生成二进制流,利用file-saver保存文件,文件名自定义
        });
    });
},

获取文件blob格式 并下载  getFile()

  getFile(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();
      });
    }

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值