>>分享Web前端开发技术,并对孙卫琴的《精通Vue.js:Web前端开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 15824 个阅读者 刷新本主题
 * 贴子主题:  vue+file-saver+jszip实现批量导出图片 回复文章 点赞(0)  收藏  
作者:javathinker    发表时间:2021-02-04 06:46:59     消息  查看  搜索  好友  复制  引用

1、安装jszip、file-saver

npm i file-saver
npm i jszip

2、封装common.js    
import JSZip from 'jszip'
import FileSaver from "file-saver";
import {
  Message
} from 'element-ui'

export function filesToRar(arrImages, filename) {
  let _this = this;
  let zip = new JSZip();
  let cache = {};
  let promises = [];
  let title = '正在加载压缩文件';

  for (let item of arrImages) {
    const promise = getImgArrayBuffer(item.fileUrl).then(data => {
      // 下载文件, 并存成ArrayBuffer对象(blob)
      zip.file(item.renameFileName, data, {
        binary: true
      }); // 逐个添加文件
      cache[item.renameFileName] = data;
    });
    promises.push(promise);
  }

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

//获取文件blob
export function getImgArrayBuffer(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();
  });

}

  3、页面引入并引用    

import {
  filesToRar,
  getImgArrayBuffer
} from '@/utils/commonMethods'

    // 批量导出头像
    batchAvatar() {
      if (this.multipleSelection && this.multipleSelection.length !== 0) {
        // 导出所选择用户头像
        let obj = this.throughData(this.multipleSelection)
        // console.log(img)
        filesToRar(obj, '批量压缩头像文件')
      }
      }
    },

    throughData(arr) {
      let img = []
      arr.map(val => {
        if (val.headImg !== '') {
          let temp = {
            renameFileName: val.number + '_' +
              val.name + '.jpg',
            fileUrl: 'http://supereye.huitianxx.com/' + val.headImg
          }
          img.push(temp)
        }
      })
      return img
    }

----------------------------
原文链接:https://www.jianshu.com/p/255c796d59af

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2021-06-12 16:55:05 重新编辑]
  Java面向对象编程-->按面向对象开发的基础范例
  JavaWeb开发-->使用过滤器
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->组合(Composition)API
  Vue3开发-->虚拟DOM和render()函数
  10个开发者经常问的JavaScript面试题(附答案解析)
  vue3.0 代理Proxy API
  web前端工程师面试题的知识考点盘总
  Vue 项目从 Vue CLI 2 升级到 Vue CLI 4
  Velocity.js动画库的使用
  HTML5中的 Web Worker的使用
  vue中axios异步调用接口的坑
  前端图片压缩库images-quickly-compress
  理解前后端分离的概念
  jQuery 选择器
  HTML DOM Script 对象
  CSS Border(边框)
  JavaScript Array(数组)对象
  JavaScript 正则表达式
  JavaScript prototype(原型对象)
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。