js实现oss批量下载文件_前端实现批量打包下载文件
需求说明:
后端接口返回附件列表(含URL),这些附件存在阿里云OSS上。一期需求是实现对列出的附件进行点击下载,也就是每次只下载点击的附件(PDF | 图片),使用一段时间后制定二期需求时,增加批量下载功能,需要打包在一起。附言:本文所写都是纯前端实现,后端接口只需要返回路径即可。
单独下载图片:
直接使用标签,会存在这样的问题:同源链接点击后直接在浏览器打开,通过在标签内指定download属性可以避免,但是非同源链接却不行。所以通过Canvas + JS方式实现点击图片直接下载,这里要解决这么几个问题:1、非同源及跨域问题;2、Canvas图片下载限制问题。同源问题很好解决,只需要一行代码:
image.setAttribute('crossOrigin', 'anonymous')
为了解决Canvas图片像素大小的限制,转为blod流数据,下面附上代码:
/**
* @param {Number} imgsrc 图片路径
* @param {Number} name 自定义图片名称
* 直接使用canvas下载有图片像素大小的限制,所以转成blod流下载
**/downloadIamge (imgsrc, name) {//下载图片地址和图片名
let image = newImage()//解决跨域 Canvas 污染问题
image.setAttribute('crossOrigin', 'anonymous')
let fun= this.dataURLtoBlob
image.οnlοad= function() {
let canvas= document.createElement('canvas') //创建Canvas
canvas.width =image.width
canvas.height=image.height
let context= canvas.getContext('2d')
context.drawImage(image,0, 0, image.width, image.height) //Canvas画图
let url = canvas.toDataURL({format: 'png', multiplier: 4}) //通过toDataURL()方法将图像转为url
var blob =fun(url)var objurl = URL.createObjectURL(blob) //转成blod
let a = document.createElement('a') //生成一个a元素
let event = new MouseEvent('click') //创建一个单击事件
a.download = name || "'photo" //设置图片名称
a.href = objurl //将生成的URL设置为a.href属性
a.dispatchEvent(event) //触发a的单击事件
}
image.src= imgsrc + '?=' + Math.random() //加入随机数 解决跨域不能下载问题
},/**
* @param {string} dataurl 图像地址
* 转blod流*/dataURLtoBlob (dataurl) {
let arr= dataurl.split(',')
let mime= arr[0].match(/:(.*?);/)[1]
let bstr= atob(arr[1])
let n=bstr.length
let u8arr= newUint8Array(n)while (n--) {
u8arr[n]=bstr.charCodeAt(n)
}return newBlob([u8arr], {type: mime})
}
在实现的时候,如果这样指定image的src属性:
image.src = imgsrc
在运行之后,发现并没有解决非同源图片直接打开的问题,所以在下载地址后加了随机数
image.src = imgsrc + '?=' + Math.random()
打包批量下载:
这里使用了其他的包:JSZip(用于文件打包)和 file-saver(用于下载),因为是在Vue项目中使用,直接在项目中下载
npm install jszip
npm install file-saver
在需要使用的文件中引入:
import JSZip from "jszip";
import FileSaver from"file-saver";
下载主方法代码如下:
//批量下载
async down() {try{
let zip= newJSZip();for (let i = 0; i < this.arr.length; i++) {
let lst= this.arr[i].split(".");
let fileType= lst[lst.length - 1];if (fileType.toLocaleUpperCase() === "PDF") {
awaitthis.getFile(this.arr[i]).then(pdf =>{
zip.file("HelloPDF.pdf", pdf, { binary: true});
});
}else{
awaitthis.getBase64Image(this.arr[i]).then(res =>{
zip.file("HelloIMG" + i + "." + fileType, res, { base64: true});
});
}
}this.downImg(zip);
}catch(err) {
console.log("err", err);
}
},
这里使用了async/await来进行文件异步操作,确保zip填充操作执行完之后,才执行zip的下载。
downImg(zip) {
zip
.generateAsync({
type:"blob"})
.then(content=>{
let fileName= "批量下载.zip";
FileSaver.saveAs(content, fileName);
});
},//****传入图片链接,返回base64数据
getBase64Image(url) {return new Promise((resolve, reject) =>{var base64 = "";var img = newImage();
img.setAttribute("crossOrigin", "Anonymous");
img.οnlοad= () =>{
base64= this.image2Base64(img);
resolve(base64.split(",")[1]);
};
img.οnerrοr= () => reject("加载失败");
// 这里可能会有跨域失败的问题,解决方案同上,url + 随机数
img.src=url;
});
},
image2Base64(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");returndataURL;
},//****传入文件链接,返回arraybuffer数据
getFile(url) {return new Promise((resolve, reject) =>{
// 这里的$http是Vue里的axiosthis.$http({
method:"get",
url,
responseType:"arraybuffer"})
.then(data=>{
resolve(data.data);
})
.catch(error =>{
reject("PDF加载失败:" +error);
});
});
},
以上,实现方式记录。
js实现oss批量下载文件_前端实现批量打包下载文件相关推荐
- 前端将二进制数据流转为文件_前端通过二进制流下载文件
JS下载文件两种方式总结: 下载文件主要分为两种形式,具体使用哪种方式取决于后台: 1.如果后台服务器的静态目录有可供下载的静态资源,后台接口返回文件路径,直接window.location.href ...
- 怎么批量下载Onedrive分享文件_怎么用PS弄字幕文件 PS批量生成字幕制作教程
[闽南网] 视频后期处理过程中需要添加字幕,这个并不难,但我们首先需要准备字幕文件,可以从网上下载素材,也可以自己制作.今天小编就教大家使用PS软件批量制作字幕,方法如下,可以参考. 如何利用Adob ...
- css初始化样式文件_前端必备技能 webpack 4. webpack处理CSS资源
每篇文章纯属个人经验观点,如有错误疏漏欢迎指正 因为 webpack 本身只具有识别 JS 的能力,所以涉及到其他资源,需要我们通过 loader 来进行特殊处理,针对不同的样式资源,需要以下几个 ...
- mac 批量清空文件夹文件_【XSS 聚宝瓶】文件及文件夹批量改名工具
置顶公众号,否则不能及时收到新文章 推荐给朋友,让朋友也能收到免费文章 在公众号发送函数或应用的关键字,即可免费获取对应教程 一.功能说明我们在日常办公的时候,经常会碰到文件名不规范,想要整理很不方便 ...
- 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景
Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...
- python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告
原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...
- java 微信企业号上传文件_微信企业号上传下载多媒体文件接口详解演示-java
讲完这篇博客,微信企业号的接口就说完了,下载了我源码的童鞋都知道,里面的备注很详细,但凡看过几遍就都会自己开发了,我说的这些接口至此我已经全部开发完了,剩下的就是你们自己写功能了,都是轻而易举的事情了 ...
- python免费下载歌曲_实现python批量下载网易云音乐的免费音乐
python视频教程栏目介绍实现下载免费音乐 相关免费学习推荐:python视频教程 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, s ...
- js进行MD5数据加盐_【q001】如何校验文件的MD5
宗旨:我授你受,你问我答:一起学习,一起进步. 小牛一直努力制作会声会影系列.系统操作系列.虚拟机系列.AE系列.PS系列等软件的视频教程和图文教程. 一个文件的MD5,通俗说是一个文件的身份证,具有 ...
- 怎么修改jar包的yml文件_电脑怎么批量修改文件名
大家好,今天分享一篇来源小白一键重装网(xiaobaixitong.com)关于解答:电脑怎么批量修改文件名. 电脑怎么批量修改文件名呢?很多小伙伴喜欢手机自拍,然后把自拍照片存储到电脑里,需要给照片 ...
最新文章
- Dell服务器网络不通故障排除
- linux培训描述,【linux培训班】关于linux系统记录和描述进程的分析
- 处理get中的中文乱码情况
- 专访阿里云域名与网站业务总经理宋瑛桥:域名未来将更加个性化、生态化和规范化...
- 2.3 最佳创新先锋:e代驾副总裁兼CTO于杨
- 【转】详细解析Java中抽象类和接口的区别
- Llinux 磁盘配额的搭建和常规问题解答
- [前端随笔][css] 弹性布局
- mysql data transfer_MySQL主从同步加速 Transfer-- FAQ
- JetBrains 2020 Java调查报告:中国开发者使用比例最高,Java 8最受欢迎
- 计算机相关报道的观后感,《新闻报道》观后感800字
- linux环境编程做的是什么,Linux环境
- AcWing 1056. 股票买卖 III
- 机器学习算法思想简单梳理
- Codeforces.1051G.Distinctification(线段树合并 并查集)
- Hibernate中的merge方法
- java数据结构银行叫号,数据结构实验二——队列(银行叫号系统)
- 用idea使用struts和hibernate来实现CRUB的操作
- 关于组织自定义皮肤/主题的一点思考
- 快递查询(快递单号智能识别/快递公司+快递单号)-完整提供 Demo 代码示例及数据专业且全面的 API 查询接口