前端下载图片

  最近的项目有个需求,就是点击按钮下载一个图片。这种下载的作过不少次了,下载过Excel,word,PDF,TXT等等,都是后台给一个连接地址,而后直接打开这个连接地址,浏览器就开始下载了。图片的话,我也是这么作的,没有问题,浏览器能正常的识别下载。可是(凡事都怕有这个可是),此次有点不同,由于这个图片就不是放在后台的,是咱们前端调用华为的OBS上传的,而后咱们还要下载这个图片,这样后台就没有办法帮忙了。固然了, 后台也能够先把这个下载到服务器,而后在让咱们去下载,可是这有点太绕远了,确定是不太可行的。因而,就开始查找前端的下载方法。总共找到了三种,分享给你们。不过须要注意的是第二种并无成功前端

  1.第一种就是后台给一个url,而后打开。这里就不详细的说了,须要后台老兄的帮忙;不过这里补充一下,就是像图片,音乐这类的文件,后台须要单独设置一下,要否则,直接打开的话,浏览器不会执行下载,而是真正的打开了音乐或者这幅图片。canvas

  2.第二种就是查到了,网上说这样能下载 <a href="图片地址" download="logo.png">下载图片</a> 也就是给a标签增长一个download属性,可是通过测试,发现这样并不能够。
跨域

  3.第三种,就比较厉害了,只要浏览器能正常的打开这个图片,而后我们就能下载。先说一下这个的原理,就是咱们点击下载以后,新建一个隐藏的canvas,大小和图片的大小保持一致,而后保存这个数据流,就启动了浏览器的下载。亲测能够下载;浏览器

  

 1         function downloadIamge(imgsrc, name) { //下载图片地址和图片名
 2             let image = new Image();  3             // 解决跨域 Canvas 污染问题
 4             image.setAttribute("crossOrigin", "anonymous");  5             image.onload = function() {  6                 let canvas = document.createElement("canvas");  7                 canvas.width = image.width;  8                 canvas.height = image.height;  9                 let context = canvas.getContext("2d"); 10                 context.drawImage(image, 0, 0, image.width, image.height); 11                 let url = canvas.toDataURL("image/png"); //获得图片的base64编码数据
12                 let a = document.createElement("a"); // 生成一个a元素
13                 let event = new MouseEvent("click"); // 建立一个单击事件
14                 a.download = name || "photo"; // 设置图片名称
15                 a.href = url; // 将生成的URL设置为a.href属性
16                 a.dispatchEvent(event); // 触发a的单击事件
17  }; 18             image.src = imgsrc; 19         }

 

而后在点击按钮的时候,直接执行这个方法,就能够了。若是仔细的观察下载的话,就能发现,我们本身手动下载保存的图片显示的是这个图片的连接地址:服务器

而咱们使用canvas方法下载的图片实际上是一个文件流:测试

能够负责任的告诉你们,这两个是一张图片。编码

相关文章
相关标签/搜索