-
第一步先处理重名的数据 ,
解决方法 :将相同名字的图片或文件后面加后缀数字作为区分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: '图片二' } ] -
引入
import JSZip from "jszip";
import FileSaver from "file-saver"; -
点击导出按钮 ,压缩包导出
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;
}
用JSZip,FileSaver 有现成cdn的http图片或者文件地址,弄成压缩包导出,解决如果文件名字都是一样的只导出一个图片或文件的方法
烂笔头12024-07-02 1:35
相关推荐
笃行35012 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核陈随易13 小时前
Vue 编译器换掉 source map,快了三四成ZhengEnCi14 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学IT_陈寒17 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘系统集成-鹰翔17 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数用户27050777252418 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法用户4993350250718 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现用户老李18 小时前
无线电自学教程 05:第一台收音机——从矿石机到 SDRIPIPD18 小时前
Node.js请求遇到503怎么重试?先解析Retry-After,再做有上限退避葡萄城技术团队18 小时前
dsh-spreadjs-editor 的集成链路:把 SpreadJS Designer 嵌进 Agent 工作台