使用jszip和file-saver导出图片,并打包为zip:

import JSZip from "jszip";
import FileSaver from "file-saver";

一,jszip解压缩

使用loadAsync,zipFile为压缩包,下面的例子表示读取zip中的result.txt文件,输出内容。

const jszip = new JSZip()
jszip.loadAsync(zipFile).then((zip) => {zip.files["result.txt"].async("string").then(function (con) {console.log(con)});
})

二、jszip压缩

先搞个简单的压缩:使用jszip创建一个名为image.zip的压缩包,其中包含一个文本文档和一个文件夹。

zip.file("hello.txt", 'hello world');
zip.folder('testfolder');
zip.generateAsync({ type: "blob" }).then(function (content) {FileSaver.saveAs(content, "images.zip");
});

再搞个文件夹包含文本文档的压缩:使用jszip创建一个名为image.zip的压缩包,其中包含一个testfolder文件夹,文件夹包含一个名为test.txt的文本文档。

zip.folder("testfolder").file('test.txt', '啦啦啦啦啦啦');
zip.generateAsync({ type: "blob" }).then(function (content) {FileSaver.saveAs(content, "images.zip");
});

最后试着创建有规律的压缩包:使用jszip创建一个名为image.zip的压缩包,其中包含五个文件夹,每个文件夹包含20个文本文档,每个文本文档的名称是各自的序号,文档内容是各自的文件名去掉后缀,文件夹的名称是各自包含的起止文件序号,例如在名为1-20的文件夹中包含1.txt、2.txt、3.txt……20.txt

for (let i = 0; i < 5; i++) {let begin = i * 20 + 1;let end = (i + 1) * 20;let img = zip.folder("photos" + begin + "-" + end);for (let j = 0; j < 20; j++) {img.file(i * 20 + j + '.txt', i * 20 + j + '');}
}
zip.generateAsync({ type: "blob" }).then(function (content) {FileSaver.saveAs(content, "images.zip");
});

三、实现导出图片zip

1、获取图片url

目前只遇到过两种情况:

  • 通过dom获取,例如 卡片+多选按钮组 方式的展示形式,勾选导出,此时可根据dom获取url;
  • 通过接口获取;

总之能拿到有效url即可。

downLoad(amount) {let url2 = ''; // 照片let self = this;Axios.get(url2).then((res) => {let arr = [];for (let i = 0, len1 = res.data.length; i < len1; i++) {if (res.data[i].pictureUrl !== '') {arr.push(res.data[i])}}let result = [];for (let i = 0, len2 = arr.length; i < len2; i += 20) {result.push(arr.slice(i, i + 20));}self.packageImages(result)}).catch((err) => {console.log(err);})
}

2、判断图片地址是否有效

只下载有效图片,所以需要验证图片是否有效:大小不应为0,宽高不应为0。

async validateImage(pathImg) { // 验证图片地址是否有效var ImgObj = new Image();ImgObj.src = pathImg;return ImgObj.fileSize > 0 || (ImgObj.width > 0 && ImgObj.height > 0);
}

3、图片转base64

需要转为base64,以供后续保存图片。

getBase64(img) {function getBase64Image(img, width, height) {// width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小let canvas = document.createElement("canvas");canvas.width = width || img.width;canvas.height = height || img.height;let ctx = canvas.getContext("2d");ctx.drawImage(img, 0, 0, canvas.width, canvas.height);let dataURL = canvas.toDataURL();return dataURL;}let image = new Image();image.crossOrigin = 'Anonymous';image.src = img;let deferred = $.Deferred();if (img) {image.onload = function () {deferred.resolve(getBase64Image(image));};return deferred.promise();}
}

4、打包下载

这里是每20张图片分一个目录,如果不需要分目录就不用将得到的图片拆成二维数组,直接打包就好。

packageImages(arr, index) {let self = this;let imgs = [];for (let i = 0; i < arr.length; i++) {for (let j = 0; j < arr[i].length; j++) {if (!arr[i][j].pictureUrl.match('base64,')) {imgs.push(arr[i][j]);}}}let imgBase64 = [];let imgsName = [];let imageSuffix = [];// 图片后缀let zip = new JSZip();for (let j = 0; j < imgs.length; j++) {let suffix = ".jpg";imageSuffix.push(suffix);this.getBase64(imgs[j].pictureUrl).then(function (base64) {imgBase64.push(base64.substring(22));let fileName = imgs[j].cardId;imgsName.push(fileName);}, function (err) {console.log(err);});}function tt() {setTimeout(function () {if (imgs.length === imgBase64.length) {for (let i = 0; i < arr.length; i++) {let begin = i * 20 + 1;let end = 0;if (arr[i].length < 20) {end = imgsName.length;} else {end = (i + 1) * 20}let img = zip.folder("photos" + begin + "-" + end);for (let j = 0; j < arr[i].length; j++) {img.file(imgsName[i * 20 + j].trim() + imageSuffix[i * 20 + j], imgBase64[i * 20 + j], {base64: true});}}zip.generateAsync({type: "blob"}).then(function(content) {FileSaver.saveAs(content, "images.zip");});} else {tt();}}, 100);}tt();
}

数据太多时下载时间很长,那页面等待时间也会很长,可以加上进度条,每20个打个包下载一个zip,更新进度条。

总结

本篇实践了jszip的压缩与解压缩,使用jszip和file-saver新建了包含文本文档、图片、文件夹的压缩包,实现了分段打包。共勉!

vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录相关推荐

  1. Linux实用操作:小技巧(快捷键)、软件安装、systemctl、软连接、日期时区、IP地址、主机名、网络传输、端口、进程管理、主机状态、环境变量、上传、下载、压缩和解压

    版本说明 当前版本号[20230415]. 版本 修改说明 20230415 初版 本课程的笔记已经更新完毕,各位可以通过点击黑马程序员2023年新版Linux零基础快速入门到精通>学习笔记总目 ...

  2. powershell 压缩和解压zip

    项目场景: 前端项目发布到windows环境需要需要先压缩传输后再解压 问题描述 简单的压缩和解压zip在windows下,视窗情况下,右键就可以实现,但是如果是在命令下,windows不自带unzi ...

  3. linux为什么用tar压缩,linux下tar压缩和解压命令用法详解

    linux下tar压缩和解压命令用法详解 2017-03-25 14:06 分享人:老牛 将/usr/local/test目录下所有文件仅打包,不压缩到 /usr/local/auto_bak/目下 ...

  4. Jpeglib使用指南, 各种压缩包的压缩和解压方法, 开源社区分裂史

    http://antkillerfarm.github.io/ Jpeglib使用指南 1.问题的由来 Jpeg图片在图像处理领域已经用的相当广泛了.但在编程领域,尤其是嵌入式编程领域使用的还不是很广 ...

  5. mac 命令行 解压7z文件_如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法...

    苹果mac电脑怎么压缩和解压文件?Mac电脑仅默认支持把文件压缩成zip格式,解压成zip.tar.gz,bz2等格式,有些操作需要安装第三方软件来完成,这篇文章为大家带来几种关于在Mac上解压和压缩 ...

  6. Mac下压缩和解压rar文件的方法

    命令行 使用工具rarosx,下载地址 选择系统和版本,本文下载的是rarosx-5.4.0.tar.gz 解压缩:tar zxvf rarosx-5.4.0.tar.gz 其中 tar 是Mac 系 ...

  7. Linux下文件(文件夹)的压缩和解压

    前言 在linux下,当我们上传一个较大的文件或者要安装一个软件(如tomcat.mysql等)时,我们需要先将官网下载的压缩包在linux服务器上进行解压,再进行安装.如果是由程序包生成的一个目录内 ...

  8. Qt-qrc资源文件-rcc打包-程序调用-ZIP压缩和解压-安装程序制作参考

    文章目录 1.qrc文件编辑 2.将qrc文件转位rcc 3.资源使用 4.ZIP压缩和解压 4.1.解压 4.2.压缩 5.错误 6.作者答疑 将程序的资源文件打包在程序的应用程序内,能够使程序保持 ...

  9. Linux如何带压缩密码的7z,Linux 压缩和解压 7z

    在上一篇教程 Linux压缩和解压rar 中写了 rar 的压缩和解压,这里继续来写 7z 的压缩和解压.7z 是现在主流的一种压缩格式,它拥有极高的压缩比,我做过一个测试,用 rar 和 7z 压缩 ...

最新文章

  1. 小程序之点击跳转到对应内容
  2. 大神TP_英雄联盟:男枪瞬秒大龙,佐伊遍地TP,新版本BUG谁来监管?
  3. Lambda expressions are not supported at language level ‘5‘
  4. [css] 移动页面底部工具条有3个图标,如何平分?在设置边框后最后一个图标掉下去了怎么办?
  5. java封装数组_Java封装数组之动态数组实现方法详解
  6. 贪心 穷举 动态规划 区别
  7. IDEA 如何根据代码自动生成类图
  8. java并发三大特性--有序性、可见性、原子性
  9. VUE组件注册与基础用法
  10. 嵌入式设备查看系统的版本、编译时间、架构等信息(uname命令)
  11. 如何解决商品秒杀超卖问题
  12. ffmpeg/ffplay 添加实时的时间水印
  13. Go 语言如何自定义 linter(静态检查工具)
  14. 解决Incorrect result size: expected 1, actual 0!
  15. 惠普HP Smart Tank 516 打印机驱动
  16. 可视化搭建,1天开发1款“智慧楼宇”应用
  17. 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)
  18. Windows下使用pip安装模块发生“failed with error code 1”的解决方法
  19. 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹
  20. 鼠标双击事件以及时间间隔判断

热门文章

  1. C#毕业设计——基于C#+asp.net+sqlserver的选课系统设计与实现(毕业论文+程序源码)——选课系统
  2. 1.2数字图像获取时的基本参数
  3. 项目测试申请验收邮件
  4. xserver源码分析之解析xorg.conf
  5. foreach循环对象集合示例
  6. 全面详细的面试指南:数据结构与算法篇 (附答案)
  7. MOS管的GS波形分析,教你如何消除MOS管的GS波形振荡~
  8. Java反射方法赋值,java反射挟制赋值
  9. mui 拾取器picker在ios16.2系统版本中错乱------亲测有效解决办法
  10. 苹果cms采集明星后不显示的解决方法