博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端实现批量导出图片并打包压缩功能
阅读量:6670 次
发布时间:2019-06-25

本文共 1908 字,大约阅读时间需要 6 分钟。

需求

管理后台需要批量导出二维码图片

选中相关二维码

图片下载打包成压缩包

实现难点

选择相应的图片批量导出或直接批量导出并压缩在一个文件夹里

思路分析

1.先将选中二维码的地址存在一个数组中

2.依次请求图片并将其下载
3.后用jszip压缩文件
4.最后用file-saver生成文件

实现

实现的代码如下

import axios from 'axios'import JSZip from 'jszip'import FileSaver from 'file-saver'getFile = (url) => {      return new Promise((resolve, reject) => {        axios({          method: 'get',          url,          responseType: 'arraybuffer'        }).then(data => {          resolve(data.data)        }).catch(error => {          reject(error.toString())        })      })    };}// 批量下载handleBatchDownload = async(selectImgList) => {      const data = selectImgList;      const zip = new JSZip()      const cache = {}      const promises = []      await data.forEach(item => {          const promise = this.getFile(item).then(data => { // 下载文件, 并存成ArrayBuffer对象          const arr_name = item.split("/");          let file_name = arr_name[arr_name.length - 1] // 获取文件名          // if (file_name.indexOf('.png') == -1) {         //    file_name = file_name + '.png'         // }          zip.file(file_name, data, {            binary: true          }) // 逐个添加文件          cache[file_name] = data        })        promises.push(promise)      })      Promise.all(promises).then(() => {        zip.generateAsync({          type: "blob"        }).then(content => { // 生成二进制流          FileSaver.saveAs(content, "photo.zip") // 利用file-saver保存文件        })      })    };

知识点总结

1.插件file-saver的使用

  • a标签download属性下载不了跨域图片直接在浏览器预览,利用file-saver将跨域访问的图片下载
  • 可以file-saver下载其他文件,详情可去参考其API
  • 如果你需要保存较大的文件,不受 blob 的大小限制或内存限制,可以看一下更高级的 StreamSaver.js

2.插件jszip的使用

  • 点击批量下载所有图片都在浏览器下载文件多表现不友好,需将批量下载的图片打包进压缩包里,故引进了JSZip进行打包
  • JSZip是一个用于创建,阅读和编辑.zip文件的JavaScript库,具有友好而简单的API,详细用法可以参照其API

备注 :

  1. 注意的是responseType, 如果下载文件是文本类型的(如: .txt, .js之类的),那么用responseType: 'text'也可以, 但是如果下载的文件是图片, 视频之类的, 就得用arraybuffer
  2. 如果下载的文件过大, 打包的时间将会很长, 甚至可能会导致浏览器奔溃
  3. 还需要注意的一点是请求图片资源时因其是异步请求,需要等所有图片请求完再进行打包这一步,在请求资源时需要await

参考文档

转载地址:http://vplxo.baihongyu.com/

你可能感兴趣的文章
做事原则
查看>>
一个男人该有的气质
查看>>
HDU 1004 Let the Balloon Rise【STL<map>】
查看>>
『cs231n』卷积神经网络工程实践技巧_下
查看>>
Anaconda和Pycharm安装和配置教程
查看>>
Java千百问_05面向对象(006)_is-a,has-a,like-a是什么
查看>>
【Python】python更新数据库脚本两种方法
查看>>
linux进程同步机制_转
查看>>
PHP框架认识初步
查看>>
给 Android 初学者的 Gradle 知识普及
查看>>
分模块开发创建Action子模块——(九)
查看>>
基于Nginx实现一个自己的HTTP模块
查看>>
LeetCode(34)-Palindrome Number
查看>>
阅读《Android 从入门到精通》(24)——切换图片
查看>>
SimpleDateFormat线程不安全及解决的方法
查看>>
Unity---------Mesh理解
查看>>
hdu 1728 逃离迷宫 bfs记转向
查看>>
一分钟学会 ConstraintLayout 之从属性角度理解布局
查看>>
线程 Timer TimerTask 计时器 定时任务 MD
查看>>
[js高手之路]原型式继承与寄生式继承
查看>>