背景需求

在前端的工作中,经常碰到点击下载图片的需求,但是有一种情况大家经常碰到,就是点击下载地址之后,在浏览器窗口默认打开了,并没有调用浏览器进行下载

如果你正在完善这个需求,一直解决不了,恭喜你看到了这篇文章。

在正式开始前,先说一下整体的逻辑
JS实现下载图片非常简单,网上有很多的分享

  1. 将图片转换为base64
  2. 为了防止大图下载失败,将base64转换为 blob;
  3. 下载图片。

编码时间

整体逻辑代码如下所示

<!DOCTYPE html>
<html lang="en">
<head><title>图片点击下载</title>
</head><body><button onclick="download_iamge('https://某地址图片','测试')">点击下载图片</button><script>function download_iamge(imgsrc,name) {var image = new Image(); // 声明图片对象image.setAttribute('crossOrigin', 'Anonymous'); // 解决跨域 Canvas 污染问题// 图片加载完毕,获取 base64 并转换为 blob 格式image.onload = function () {var canvas = document.createElement('canvas');canvas.width = image.width;canvas.height = image.height;var context = canvas.getContext('2d');context.drawImage(image, 0, 0, image.width, image.height);var data_base64 = canvas.toDataURL('image/png'); //得到图片的base64编码数据var blob_ = data_to_blob(data_base64); // 转换为 blobvar url = {name: name,src: blob_};if (window.navigator.msSaveOrOpenBlob) {   navigator.msSaveBlob(url.src, url.name);} else {var link = document.createElement("a");link.setAttribute("href", window.URL.createObjectURL(url.src));link.setAttribute("download", url.name + '.png');document.body.appendChild(link);link.click();}};image.src = imgsrc;// base64 转换为 blob function data_to_blob(data_base64) {var arr = data_base64.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], {type: mime});}}</script></body></html>

答题时间

很多教程到此就结束了,但是并没有说明以下几个问题

'crossOrigin', 'Anonymous':canvas 跨域问题

如果没有该内容将会出现错误内容:canvas无法执行toDataURL方法,即污染的画布无法输出,但是这里其实还存在一个问题,就是如果你使用的是 cdn 加速的静态图片,那还是无法跨域,解决的亮点在于配置 CDN HTTP头配置跨域资源共享(CORS),从而解决该问题,如果你没有运维权限,可以联系运维工程师,在CDN后台参考下述配置。

一定让 CDN 的响应头包含如下配置 Access-Control-Allow-Origin:*,当然仅开启某些域名跨域访问也是可以的,看需求。

如果你使用的不是CDN,而是其它服务器,但服务和资源不在一个域名下
以下内容使用 Nginx 进行介绍。
在静态资源服务器配置如下内容。

location ^~ /静态资源文件夹/ {alias /www/wwwroot/静态资源文件夹/;# 开启允许跨域访问add_header 'Access-Control-Allow-Origin' '*';
}

我想,到这里你已经能完成 js 实现图片下载 这一操作了

这里还会衍生出一个面试问题,你知道 canvas 污染么?

扩展阅读:

  • CDN如何通过HTTP头配置跨域资源共享(CORS)

记录时间

2022年度 Flag,写作的 563 / 1024 篇。
可以关注我,点赞我、评论我、收藏我啦。

更多精彩

  • Python 爬虫 100 例教程导航帖(连续 3 年,不断更!)
  • Python爬虫120 (39.9 元,保 5 年更新)

JS将图片转化为base64编码,并实现点击下载,js实现图片下载的实操博客相关推荐

  1. Python将图片转化为base64编码以及如何在html网页上显示

    1.Python将图片转化为base64编码 test.py # -*- coding: utf-8 -*- import base64 #这一段代码时间图片转化为base64 with open(& ...

  2. 图片转化为base64编码python版本

    写在前面:好久没写python了难免有些生疏,尴尬的搓手手,学以致用,还需勤练.变量名都会命错也是绝了 起因:写markdown文档想插入图片,百度了一下选择直接嵌入的base64编码,安全放心.可转 ...

  3. 如何将图片转化为base64编码格式,在css中显示

    在前端开发过程中有时候需要图片.svg.ico等转成base64直接在css中使用,可以提高加载速度.将图片转换成base64编码,在web网上一般用于小图片上,不仅可以减少图片的请求数量(集合到js ...

  4. php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...

    本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...

  5. 服务器图片转化为base64进行海报合成

    问题:html2canvas.js 在合成海报时,海报如果是服务器地址将会报跨域,这时需要将图片转化为base64格式再去进行合成. 附:html2canvas.js文件 <!-- 海报弹窗 - ...

  6. base64转html文件,图片转换成Base64编码集成到html文件

    首先为什么要这么做?  原因很简单这样可以减少与服务器的请求,当然对于一些浏览器并不支持,如IE8.通常用在手机版网站中,具体转化方法如下: 1.在线打开Base64的编码器将图片编码成Base64 ...

  7. Java实现读取服务器上的图片并进行base64编码

    实现代码如下: /*** 图片地址进行Base64编码* @param imgUrl* @return*/ public static String image2Base64(String imgUr ...

  8. JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库

    转载自  JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库 开发环境:struts2+ spring + hibernate 数据库:oracle 需求:在HTML编 ...

  9. nmmqq.php?/lspc.html,html中的图片直接使用base64编码后的字符串代替详解

    网页中的图片是使用base64编码后的字符串代替了,这个叫做Data URI scheme,下面有个不错的示例,大家可以参考下 最近来了一个网页,里面有图片,但是却没有引用外部的图片资源,很好奇.查看 ...

最新文章

  1. 线段树 ---- 线段树上区间二分 或者单点二分 codeforces C. Greedy Shopping
  2. boost::locale::utf8_codecvt用法的测试程序
  3. Mac下Sublime text2中文乱码问题的解决
  4. 正则获取前8位数字_数据取整,获取字符串前数字另辟蹊径之LOOKUP
  5. 登录和注销、基于Session的购物车案例、验证码的使用、防止表单重复提交
  6. 成为前端开发人员的步骤
  7. 洛谷P3369 【模板】普通平衡树(STL做法:vectormultiset)
  8. bzoj 4950: [Wf2017]Mission Improbable(二分匹配)
  9. 强烈推荐!!!Ubuntu19.04安装向日葵踩到的坑【尤其是ubuntu 19.04 遇到了libpng12.so.0 导致无法apt 更新!!!!】
  10. Android实现手机和电脑屏幕共享
  11. 7、微信小程序-wxs脚本
  12. 苹果手机登陆不进去显示连接服务器6,苹果6为什么显示无法连接到APPStore
  13. Linux 系统不能正常关机解决办法
  14. uniapp 跳转公众号获其他小程序
  15. 如何用proe/croe将三维文件转为二维CAD轴侧图
  16. 学习python表情包_我用Python一键保存了半佛老师所有的骚气表情包
  17. 学习日志——2019/07/04
  18. 【压缩感知合集7】压缩感知RIP有限等距性:定义解析,理解说明,数学原理推导
  19. 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)
  20. 一对一直播源码、一对一聊天app源码前端后台功能说明

热门文章

  1. 资料:《新概念英语》旧版(第一册)原文及全文翻译
  2. Nginx reload和restart区别
  3. css中filter:alpha透明度总结
  4. chrome浏览器被2345和newduba(毒霸)劫持-介绍主流的两种方式
  5. (强烈推荐)移动端音视频从零到上手
  6. 遭遇Eva.vbs病毒
  7. 土木专业学python有什么用-python在土木
  8. Mac 下隐藏显示文件夹的快捷键
  9. 验证为制药无菌生产提供保障
  10. SQL创建日历 包含年月日/周/星期几