1.需求:

所有设备的二维码单个下载很麻烦 需要批量导出

2.问题

2.1使用DataURl格式生成zip

按照jszipAPI 官方示例 使用 DataURl导出的是空文件夹

How to write a file / give it to the user

// canvsa转化为blob类型;在使用FileReader转化为DataURI 然后压缩到jszip
canvasContent.toBlob((blob) => {let reader = new FileReader()reader.readAsDataURL(blob)reader.addEventListener('loadend',()=> {// replace()替换掉多余的描述部分 不然jszip会报错说这个可能是DataURLlet DataURI = reader.result.replace(/^data:image\/(png|jpg);base64,/, "")zip.file(file_name, DataURI , { base64: true })})})zip.generateAsync({ type: "base64" }).then( (base64) => {location.href = "data:application/zip;base64," + base64;});

不适用replace 替换多余描述部分报错图:

2.2使用Blob格式生成zip

根据jsZip 文档说明传入canvas.toBlob()生成的Bolb类型文件生成的图片破损 无法使用

点开是下面这样:

问题就出现在HTMLCanvasElement.toBlob() 这个方法 这个方法转化出来的Blob类型数据使用jsZip压缩后图片破损,使用自己封装的DataUrl 转 Blob 数据生成图片没有问题可以显示

MDN 关于 toBlob 方法的描述:

HTMLCanvasElement.toBlob() - Web API 接口参考 | MDN

3.问题解决

调用Canvas的toBlob生成的blob数据jszip压缩成图片会损坏;

使用自己封装的转化Bolb方法再去压缩 没有问题;

经过测试比对 两者生成的Blob对象 大小一样 但是手写DataToBlob方法可以生成正确图片

原本猜测可能是由于toBlob()方法的异步导致 但是经过包装Promise 后测试发现不是这个问题

        // 获取canvasDomconst canvasContent = qrCode.querySelectorAll("canvas")[1];const imgurl = canvasContent.toDataURL("image/png");let blob = dataURLtoBlob(imgurl)console.log(blob, 'custom DataToBlob');canvasContent.toBlob((blob) => {console.log(blob, 'toBlob()生成');})

3.完整代码

       // 批量生成二维码mutiplyQrcode() {if (!this.currentChecked.length) return this.$message.info('请选择操作项')const zip = new JSZip()this.currentChecked.forEach(item => {let { teId, teNo, teName } = itemlet file_name = '设备' + teNo + '.png'let qrCode = this.generatorQrcode(teId, teNo, teName)//拿到canvas Domconst canvasContent = qrCode.querySelectorAll("canvas")[1];//转化为DataURLconst imgurl = canvasContent.toDataURL("image/png");//转化为Bolblet blob = this.dataURLtoBlob(imgurl)zip.file(file_name, blob, { binary: true })})zip.generateAsync({type: "blob"}).then(content => { // 生成二进制流saveAs(content, "设备二维码.zip") // 利用file-saver保存文件})},dataURLtoBlob(dataurl) {var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], { type: mime });},// 这个只是canvas生成二维码的方法可以不需要看generatorQrcode(teId, teNo, teName) {let qrcodeContent = document.createElement("div");qrcodeContent.width = '400px'qrcodeContent.height = '400px'let qrcodeCanvas = new QRCode(qrcodeContent, {// text: row.teQrCodeValue, // 需要转换为二维码的内容text: this.$qrCodeUrl + "#/maintain-equipment-detail/" + teId, // 需要转换为二维码的内容//   text: String(this.dialogData.teId), // 需要转换为二维码的内容width: 400,height: 400,colorDark: "#000000",colorLight: "#ffffff",correctLevel: QRCode.CorrectLevel.H,});var resolutionMultiple = 1; // 分辨率倍数var borderSize = 5 * resolutionMultiple; // 边框留白var canvasWidth = 500 * resolutionMultiple; // 图片宽度var text = teNo + '-' + teName; // 底部文字var fontSize = 32 * resolutionMultiple; // 文字大小var canvasHeight = canvasWidth + fontSize;var canvas = document.createElement("canvas");if (!canvas.getContext) return;canvas.width = canvasWidth;canvas.height = canvasHeight;var ctx = canvas.getContext("2d");ctx.fillStyle = "rgb(255,255,255)"; // 调色(纯白)ctx.fillRect(0, 0, canvasWidth, canvasHeight); // 绘制背景var qrcodeSize = canvasWidth - borderSize * 2;ctx.drawImage(qrcodeContent.querySelector("canvas"),borderSize,borderSize,qrcodeSize,qrcodeSize); // 填充二维码ctx.fill(); // 填充背景ctx.fillStyle = "rgb(0,0,0)"; // 调色(纯黑)ctx.font = fontSize + "px Arial"; // 文本大小, 字体ctx.textAlign = "center";ctx.fillText(text,canvasWidth / 2,qrcodeSize + borderSize + fontSize,qrcodeSize); // 绘制文本// 清除原二维码qrcodeCanvas.clear()qrcodeContent.appendChild(canvas);return qrcodeContent}

4.API参考

jszip API JSZip API

jszip压缩图片file-saver批量导出空文件夹以及有损图片问题解决相关推荐

  1. 批量清除空文件夹——《超级处理器》应用

    怎么批量清除空文件夹,包括子文件夹中的空文件夹,其实很简单,只需要三步,我们来演示一下. 第一步.打开超级处理器菜单: 第二步.点击清除空文件夹按钮: 第三步.找到需要清除的文件夹,选中后点击确定,完 ...

  2. 【Python】批量导出word文档中的图片、嵌入式文件

    Python 批量导出word文档中的图片.嵌入式文件 需求 学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交 ...

  3. java压缩文件夹(含有空文件夹)

    两种实现方式: java.util.zip.ZipOutputStream org.apache.tools.ant 注意 最初采用java.util.zip.ZipOutputStream的方式, ...

  4. 删除空文件夹 linux,Linux中find批量删除空文件及空文件夹脚本

    Linux中find批量删除空文件及空文件夹脚本 linux下批量删除空文件(大小等于0的文件)的方法 代码如下 复制代码 find . -name "" -type f -siz ...

  5. Opencv——批量处理同一文件夹下的图片(解决savedfilename = dest + filenames[i].substr(len)问题)

    文章目录 前言 一.完整代码 二.实现效果 前言 第一份代码实现了批量修改同一文件夹下图片的尺寸,有其他需求时仅需修改处理部分的代码以及文件夹路径. 第二份代码实现了批量截取同一文件夹下每张图片的RO ...

  6. 查找空目录Linux,Linux中find批量删除空文件及空文件夹脚本

    find . -name "*" -type f -size 0c | xargs -n 1 rm -f #linux下批量删除空文件(大小等于0的文件) 删除指定大小的文件,只要 ...

  7. 批量处理不同文件夹下同名图片到相同文件内,简单处理

    批量处理不同文件夹下同名图片到相同文件内 第一步:在不同文件夹下搜索同名图片名称 例如在我的多个_json文件夹下存在同名的图片img.png,因此利用搜索功能将所有_json下的img.png图片全 ...

  8. php递归删除空数组,php 递归删除非空文件夹示例

    这篇文章主要为大家详细介绍了php 递归删除非空文件夹示例,具有一定的参考价值,可以用来参考一下. 对php递归删除非空的文件夹感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! /** * ...

  9. 解决Git无法同步空文件夹的问题

    思路:在每个空文件夹下创建空文件,同步后再删除 1 package org.zln.module1.demo1; 2 3 import org.apache.log4j.Logger; 4 5 imp ...

最新文章

  1. 设计模式学习2 工厂模式
  2. 26.使用ajaxSetup()方法设置全局Ajax默认选项
  3. Spark 开窗函数
  4. 51nod挑的部分5级题
  5. java class.getmethod_java反射之Class.getMethod与getDeclaredMethods()区别
  6. java web获取请求体内容
  7. 1.程序员的自我修养---简介
  8. python使用webdriver处理上传文件(使用AutoIt)
  9. 在java中调用python程序
  10. Java代码审计详解
  11. python历史时间轴可视化_TimeLine一个基于Python的时间轴创建者 | MOS86
  12. 鼠标自动点击器linux,鼠标自动点击器PC版下载
  13. JS匹配域名的正则表达式
  14. Excel 高级筛选实现多条件筛选数据
  15. 读书狂想之《平凡的世界》不平凡的人生
  16. javascript检测5到10位数的QQ号
  17. 计算机网络波动大,网络不稳定怎么办,小编教你电脑网络不稳定怎么办
  18. 网页实现excel下载
  19. 修改人人商城服务器时间,修改收货地址 · 人人商城二次开发常用文档,超详细,微擎开发微擎二次开发【持续更新】 · 看云...
  20. 拖拽牛逼,轻松实现一个自由拖拽的组件

热门文章

  1. C语言 队列(循环队列)
  2. matlab编程反演S参数求电磁参数,如何通过CST仿真出来的S参数获得SRR结构的等效电磁参数...
  3. could not open Java\jre7\lib\amd64\jvm.cfg解决方案
  4. 计算机网络研究进展,高性能计算机网络研究进展-人文社科教育.pdf
  5. C语言程序设计——三子棋游戏
  6. 除征信快查外,用户画像和风控模型如何助力网络小贷风控
  7. VS远程调试连接失败
  8. Remote desktop web access
  9. Android源码编译及启动模拟器
  10. TCP和UDP区别以及TCP的三次握手和四次挥手