前端获取图片列表打包下载

导入依赖

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

注意问题

1.图片跨域问题,因为图片是oss上需要设置跨域规则才能访问到图片全路径地址。

封装js

export function downloadAll() {
  // 这里随便定义的数据
  const sourceList = [
    {
      id: 1,
      qrCode:
        "https://hzhoss.oss-cn-hangzhou.aliyuncs.com/2022/02/26/homeLogo.png",
      picName: "图片1",
    },
  ];
  const zipName = "资料下载"
  // 执行打包下载 参数一下载的批量图片信息, 参数二打包后的压缩包名称自己定义
  downloadZip(sourceList, zipName);
}

图片处理

  // 转换图片为base64格式
function getImageBase64(image) {
    // 创建一个画布
    const canvas = document.createElement("canvas");
    // 让画布的宽高等于图片的宽高
    canvas.width = image.width;
    canvas.height = image.height;
    // 然后在画布上进行画画
    const ctx = canvas.getContext("2d");
    // 开始画图片,1.绘制的对象2.绘制的位置,3绘制的宽高
    ctx.drawImage(image, 0, 0, image.width, image.height);
    return canvas.toDataURL();
}

压缩

async function downloadZip(sourceList, zipName) {
    const zip = new JSZip(); // 创建一个压缩对象
    const fileFolder = zip.folder(zipName); // 创建 zipName 文件夹
    const fileList = [];
    // 遍历图片数据
    for (let i = 0; i < sourceList.length; i++) {
      // 压缩后的每张图片对应名
      const name = sourceList[i].picName; // 注意: 每张图片的名称--需要对数据属性进行转换
      // 创建图片对象 设置图片基本信息
      const image = new Image();
      image.setAttribute("crossOrigin", "Anonymous"); // 设置 crossOrigin 属性,解决图片跨域报错
      // 设置图片地址----稍后进行base64转换
      image.src = sourceList[i].qrCode;
      // 图片下载
      image.onload = async () => {
        // 路径base64转换
        const url = await getImageBase64(image);
        // 往压缩包里添加图片数据
        fileList.push({
          name: name, // 压缩名
          img: url.substring(22), // 去掉base64文件标识,img是文件形式
        });
        // 确保每个数据都遍历完
        if (fileList.length === sourceList.length) {
          // 确保数据不为空
          if (fileList.length) {
            for (let k = 0; k < fileList.length; k++) {
              // 往文件夹中,添加每张图片数据fileFolder文件夹压缩包
              fileFolder.file(fileList[k].name + ".png", fileList[k].img, {
                base64: true,
                // 下面的可以省略
                compression: "DEFLATE", // STORE:默认不压缩 DEFLATE:需要压缩
                compressionOptions: {
                  level: 9, // 压缩等级1~9    1压缩速度最快,9最优压缩方式
                  // [使用一张图片测试之后1和9压缩的力度不大,相差100字节左右]
                  // 注意到达这里的时候image的路径必须是带有data:image/png;base64,
                },
              });
            }
            zip
              .generateAsync({
                // 压缩的结果为blob类型(二进制流),可用作文件上传
                type: "blob",
              })
              .then((content) => {
                // 直接在浏览器打成zipName.zip包并下载,saveAs依赖的js是FileSaver.js
                FileSaver.saveAs(content, zipName + ".zip");
              }).catch(msg => {
                console.log(msg)
              });
          }
        }
      };
    }
}

所有代码放在一个js

导入调用,传参的地方自己修改下

import {downloadAll} from "@/api/utils/down"
// 点击下载
    downImg() {
      if (this.studentImageList.length > 0) {
        console.log("开始下载")
        // const imageList = ["https://hzhoss.oss-cn-hangzhou.aliyuncs.com/2022/02/26/homeLogo.png"]
          downloadAll()
      }
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值