用JSZip,FileSaver 有现成cdn的http图片或者文件地址,弄成压缩包导出,解决如果文件名字都是一样的只导出一个图片或文件的方法

  1. 第一步先处理重名的数据 ,
    解决方法 :将相同名字的图片或文件后面加后缀数字作为区分

    let arr = [{name:'图片一',url:'http://cdn'}, {name:'图片一',url:'http://cdn'}, {name:'图片二',url:'http://cdn'}];

    // 创建一个对象来跟踪已经遇到的名称和它们的计数
    let nameCounts = {};
    // 遍历数组,并更新对象
    arr.forEach((obj, index) => {
    // 如果当前对象的name在nameCounts中存在,说明是重名
    if (nameCounts[obj.name]) {
    // 增加计数,并更新对象的name属性,添加序号
    obj.name = ${obj.name}(${nameCounts[obj.name]});
    // 更新nameCounts中对应name的计数
    nameCounts[obj.name]++;
    } else {
    // 如果name不存在于nameCounts中,则初始化为1(但实际上不会立即用到这个1)
    nameCounts[obj.name] = 1;
    }
    // 注意:对于不重名的name,我们不会更改它们的name属性,也不会增加nameCounts中的计数
    });
    console.log(arr);
    // [ { name: '图片一(1)' }, { name: '图片一(2)' }, { name: '图片二' } ]

  2. 引入

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

  3. 点击导出按钮 ,压缩包导出

    async down(){
    let zip = new JSZip();
    for (let i = 0; i < this.arr.length; i++) {
    let file = arr[i].url.split(".");
    let fileType = file[file.length - 1];
    const fileName = arr[i].name
    // 文件类型 DOC XLS 等等都可以加进来
    if (fileType.toLocaleUpperCase() === "PDF") {
    await this.getFile(this.arr[i].url).then((res) => zip.file(fileName, res, { binary: true }))
    } else { // 图片
    await this.getBase64Img(this.arr[i].url).then((res) => zip.file(fileName, res, { base64: true }));
    }
    zip.generateAsync({ type: "blob" }).then((content) => {
    let fileName = "批量导出.zip";
    FileSaver.saveAs(content, fileName);
    });
    }
    },
    getFile(url) {
    return new Promise((resolve, reject) => {
    this.$http({ method: "get" , url , responseType: "arraybuffer" }).then((data) => resolve(data.data)).catch((error) => reject("PDF加载失败:" + error));
    });
    },
    getBase64Img(url) {
    return new Promise((resolve, reject) => {
    var base64 = "";
    var img = new Image();
    img.setAttribute("crossOrigin", "Anonymous");
    img.onload = () => {
    base64 = this.canBase64(img);
    resolve(base64.split(",")[1]);
    };
    img.onerror = () => reject("加载失败"); // 这里可能会有跨域失败的问题,解决方案同上,url + 随机数
    img.src = url + "?t=" + new Date().getTime();
    });
    },
    canBase64(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);
    var dataURL = canvas.toDataURL("image/png");
    return dataURL;
    }

相关推荐
weixin_493503676 小时前
Vue3 前端生成 PDF:会员证书与活动签到表的三种打印方案与踩坑记录
前端·pdf·状态模式
李少兄8 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
尾善爱看海9 小时前
前端算法与手写题集
前端·算法
徐小夕10 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
shmily麻瓜小菜鸡11 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
萧鼎11 小时前
Python 高性能Web框架神器 FastAPI:自动生成API文、基于Pydant、异步请求处理全搞定
前端·python·fastapi
IT_陈寒12 小时前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
计算机魔术师12 小时前
5000亿估值冲刺科创板,DeepSeek 为何急着上市?
前端
我血条子呢12 小时前
前端解析word方案
前端·word
kyriewen12 小时前
我用 AI 写完一个需求后才发现,最难的不是 prompt,而是验收
前端·程序员·ai编程