需求说明:

后端接口返回附件列表(含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批量下载文件_前端实现批量打包下载文件相关推荐

  1. 前端将二进制数据流转为文件_前端通过二进制流下载文件

    JS下载文件两种方式总结: 下载文件主要分为两种形式,具体使用哪种方式取决于后台: 1.如果后台服务器的静态目录有可供下载的静态资源,后台接口返回文件路径,直接window.location.href ...

  2. 怎么批量下载Onedrive分享文件_怎么用PS弄字幕文件 PS批量生成字幕制作教程

    [闽南网] 视频后期处理过程中需要添加字幕,这个并不难,但我们首先需要准备字幕文件,可以从网上下载素材,也可以自己制作.今天小编就教大家使用PS软件批量制作字幕,方法如下,可以参考. 如何利用Adob ...

  3. css初始化样式文件_前端必备技能 webpack 4. webpack处理CSS资源

    每篇文章纯属个人经验观点,如有错误疏漏欢迎指正   因为 webpack 本身只具有识别 JS 的能力,所以涉及到其他资源,需要我们通过 loader 来进行特殊处理,针对不同的样式资源,需要以下几个 ...

  4. mac 批量清空文件夹文件_【XSS 聚宝瓶】文件及文件夹批量改名工具

    置顶公众号,否则不能及时收到新文章 推荐给朋友,让朋友也能收到免费文章 在公众号发送函数或应用的关键字,即可免费获取对应教程 一.功能说明我们在日常办公的时候,经常会碰到文件名不规范,想要整理很不方便 ...

  5. 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景

    Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...

  6. python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告

    原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...

  7. java 微信企业号上传文件_微信企业号上传下载多媒体文件接口详解演示-java

    讲完这篇博客,微信企业号的接口就说完了,下载了我源码的童鞋都知道,里面的备注很详细,但凡看过几遍就都会自己开发了,我说的这些接口至此我已经全部开发完了,剩下的就是你们自己写功能了,都是轻而易举的事情了 ...

  8. python免费下载歌曲_实现python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 相关免费学习推荐:python视频教程 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, s ...

  9. js进行MD5数据加盐_【q001】如何校验文件的MD5

    宗旨:我授你受,你问我答:一起学习,一起进步. 小牛一直努力制作会声会影系列.系统操作系列.虚拟机系列.AE系列.PS系列等软件的视频教程和图文教程. 一个文件的MD5,通俗说是一个文件的身份证,具有 ...

  10. 怎么修改jar包的yml文件_电脑怎么批量修改文件名

    大家好,今天分享一篇来源小白一键重装网(xiaobaixitong.com)关于解答:电脑怎么批量修改文件名. 电脑怎么批量修改文件名呢?很多小伙伴喜欢手机自拍,然后把自拍照片存储到电脑里,需要给照片 ...

最新文章

  1. Dell服务器网络不通故障排除
  2. linux培训描述,【linux培训班】关于linux系统记录和描述进程的分析
  3. 处理get中的中文乱码情况
  4. 专访阿里云域名与网站业务总经理宋瑛桥:域名未来将更加个性化、生态化和规范化...
  5. 2.3 最佳创新先锋:e代驾副总裁兼CTO于杨
  6. 【转】详细解析Java中抽象类和接口的区别
  7. Llinux 磁盘配额的搭建和常规问题解答
  8. [前端随笔][css] 弹性布局
  9. mysql data transfer_MySQL主从同步加速 Transfer-- FAQ
  10. JetBrains 2020 Java调查报告:中国开发者使用比例最高,Java 8最受欢迎
  11. 计算机相关报道的观后感,《新闻报道》观后感800字
  12. linux环境编程做的是什么,Linux环境
  13. AcWing 1056. 股票买卖 III
  14. 机器学习算法思想简单梳理
  15. Codeforces.1051G.Distinctification(线段树合并 并查集)
  16. Hibernate中的merge方法
  17. java数据结构银行叫号,数据结构实验二——队列(银行叫号系统)
  18. 用idea使用struts和hibernate来实现CRUB的操作
  19. 关于组织自定义皮肤/主题的一点思考
  20. 快递查询(快递单号智能识别/快递公司+快递单号)-完整提供 Demo 代码示例及数据专业且全面的 API 查询接口

热门文章

  1. 【LeetCode - 马化腾】第一次看到马总的代码
  2. 解决MacOs10.15+ shimo 无法正常使用 PPTP协议问题
  3. 千呼万唤始出来 Google GDrive将于4月初正式推出
  4. FineBI教程之入门例子
  5. linux shell 中各种符号的含义
  6. torch.nn到底是什么?(精简版)
  7. 【数据挖掘】金山办公2020校招大数据和机器学习算法笔试题
  8. 怎样更改计算机的sid,关于Windows系统sid修改方法
  9. HBO解密:他们为什么要开发VR版《西部世界》
  10. 基于PythonGUI的原神圣遗物游戏装备管理与角色数值模拟系统