vue 批量生成多个二维码图片并下载成压缩文件

需求背景:根据table中的数据,下载对应的二维码,并需在二维码下方添加编号和地址。实现效果如下图↓

需先使用qrcodejs2插件生成二维码,后使用html2canvas插件对页面指定区域进行图片生成,并通过JSZip和FileSaver插件对生成的图片进行压缩并导出成压缩文件格式!

<template>    
   <div ref="html2canvasRef">
        <div id="qrCode"></div> 
        <div>{{msgInfo.num}}</div> 
        <div>{{msgInfo.address}}</div> 
    </div>
</template> 
<script>
import QRCode from "qrcodejs2"; //生成二维码
import html2canvas from "html2canvas"; //生成图片
import JSZip from "jszip"; //文件压缩
import FileSaver from "file-saver"; //导出文件
export default{
   data() {
    return {
      dataList: [ //需生成的数据,
           {
             id:1,
             num:'GZ000000003',
             address:'名称超级无敌长的地址无敌长的地址'
           },
           {
             id:2,
             num:'GZ000000004',
             address:'名称超级无敌长的地址无敌长的地址'
           }
      ]
      msgInfo:{} //保存当前编号和地址
    };
  },
 methods:{
     //二维码生成
    qrCodeInit(row) {
       this.msgInfo=row
       return new Promise((resolve) => {
            let result = new QRCode(document.getElementById("qrCode"), {
                text: row,
                width: 180,
                height: 180,
                colorDark: "#333333",
                colorLight: "#ffffff",
                correctLevel: QRCode.CorrectLevel.L,
            });
            resolve(result)
        })
    },

   //删除上一张二维码 
    removeCode() {
      const codeHtml = document.getElementById("qrCode");
      while (codeHtml.firstChild) {
        codeHtml.removeChild(codeHtml.firstChild);
      }
    },

   // base64 转 二进制流(blob)
    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,
      });
    },

   //图片生成下载
    async batchDownload() {
      const imgList = []; //保存生成图片
      for (let i = 0; i < this.dataList.length; i++) {
        await this.qrcodeInit(this.dataList[i]);
        await html2canvas(this.$refs.html2canvasRef, {
          backgroundColor: null,
          useCORS: true,
          scale: 1,
        }).then((canvas) => {
          this.removeCode(); //图片生成完成时删除图片
          let url = canvas.toDataURL("image/png");
          imgList.push({ url, name: this.dataList[i].num});
         //判断当生成的图片和要生成的数据长度相等时调用压缩函数
          if (imgList.length === this.dataList.length) {
            this.imageCompress(imgList);
          }
        });
      }
    },

     // 压缩转码
    imageCompress(imgList) {
      let zip = new JSZip();
      let index = 0;
      for (let i = 0; i < imgList.length; i++) {
        index++;
        let blob = this.dataURLtoBlob(imgList[i].url); //转二进制
        zip.file(imgList[i].num+ ".png", blob, { blob: true }); //图片名称(这里以编号命名)
        if (index === imgList.length) { 
          zip.generateAsync({ type: "blob" }).then(
            (blob) => {
              FileSaver.saveAs(blob, "批量下载.zip"); //下载之后的文件名
            },
            (err) => {
             consle.log(err)
            }
          );
        }
      }
    },
 },
}
</script>

Result!

本人是个小白鼠,如果各位看官有更好的实现方法,希望在评论区和各位进行讨论!

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用以下步骤来批量生成二维码下载: 1. 安装 vue-qr 依赖 使用 npm 命令进行安装: ``` npm install vue-qr --save ``` 2. 编写组件 在 Vue 组件中引入 vue-qr,使用 v-for 循环生成多个二维码,并添加下载功能。 ``` <template> <div> <div v-for="(item, index) in qrList" :key="index"> <img :src="item" /> <button @click="downloadQR(index)">下载二维码</button> </div> </div> </template> <script> import VueQr from 'vue-qr' export default { data() { return { qrList: ['http://www.example.com/qr1', 'http://www.example.com/qr2', 'http://www.example.com/qr3'] } }, components: { VueQr }, methods: { downloadQR(index) { const link = document.createElement('a') link.href = this.qrList[index] link.download = `qr-${index}.png` document.body.appendChild(link) link.click() document.body.removeChild(link) } } } </script> ``` 3. 生成二维码 在组件中使用 VueQr 组件生成二维码: ``` <vue-qr :value="item"></vue-qr> ``` 其中,`:value` 属性绑定的是二维码的内容。 4. 下载二维码下载按钮的点击事件中,使用 JavaScript 中的 download 属性来下载二维码。代码如下: ``` downloadQR(index) { const link = document.createElement('a') link.href = this.qrList[index] link.download = `qr-${index}.png` document.body.appendChild(link) link.click() document.body.removeChild(link) } ``` 其中,`this.qrList[index]` 表示当前二维码的链接,`qr-${index}.png` 表示下载的文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值