JS将图片转化为base64编码,并实现点击下载,js实现图片下载的实操博客
背景需求
在前端的工作中,经常碰到点击下载图片的需求,但是有一种情况大家经常碰到,就是点击下载地址之后,在浏览器窗口默认打开了,并没有调用浏览器进行下载
如果你正在完善这个需求,一直解决不了,恭喜你看到了这篇文章。
在正式开始前,先说一下整体的逻辑
JS实现下载图片非常简单,网上有很多的分享
- 将图片转换为base64
- 为了防止大图下载失败,将base64转换为 blob;
- 下载图片。
编码时间
整体逻辑代码如下所示
<!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实现图片下载的实操博客相关推荐
- Python将图片转化为base64编码以及如何在html网页上显示
1.Python将图片转化为base64编码 test.py # -*- coding: utf-8 -*- import base64 #这一段代码时间图片转化为base64 with open(& ...
- 图片转化为base64编码python版本
写在前面:好久没写python了难免有些生疏,尴尬的搓手手,学以致用,还需勤练.变量名都会命错也是绝了 起因:写markdown文档想插入图片,百度了一下选择直接嵌入的base64编码,安全放心.可转 ...
- 如何将图片转化为base64编码格式,在css中显示
在前端开发过程中有时候需要图片.svg.ico等转成base64直接在css中使用,可以提高加载速度.将图片转换成base64编码,在web网上一般用于小图片上,不仅可以减少图片的请求数量(集合到js ...
- php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...
本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...
- 服务器图片转化为base64进行海报合成
问题:html2canvas.js 在合成海报时,海报如果是服务器地址将会报跨域,这时需要将图片转化为base64格式再去进行合成. 附:html2canvas.js文件 <!-- 海报弹窗 - ...
- base64转html文件,图片转换成Base64编码集成到html文件
首先为什么要这么做? 原因很简单这样可以减少与服务器的请求,当然对于一些浏览器并不支持,如IE8.通常用在手机版网站中,具体转化方法如下: 1.在线打开Base64的编码器将图片编码成Base64 ...
- Java实现读取服务器上的图片并进行base64编码
实现代码如下: /*** 图片地址进行Base64编码* @param imgUrl* @return*/ public static String image2Base64(String imgUr ...
- JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库
转载自 JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库 开发环境:struts2+ spring + hibernate 数据库:oracle 需求:在HTML编 ...
- nmmqq.php?/lspc.html,html中的图片直接使用base64编码后的字符串代替详解
网页中的图片是使用base64编码后的字符串代替了,这个叫做Data URI scheme,下面有个不错的示例,大家可以参考下 最近来了一个网页,里面有图片,但是却没有引用外部的图片资源,很好奇.查看 ...
最新文章
- 线段树 ---- 线段树上区间二分 或者单点二分 codeforces C. Greedy Shopping
- boost::locale::utf8_codecvt用法的测试程序
- Mac下Sublime text2中文乱码问题的解决
- 正则获取前8位数字_数据取整,获取字符串前数字另辟蹊径之LOOKUP
- 登录和注销、基于Session的购物车案例、验证码的使用、防止表单重复提交
- 成为前端开发人员的步骤
- 洛谷P3369 【模板】普通平衡树(STL做法:vectormultiset)
- bzoj 4950: [Wf2017]Mission Improbable(二分匹配)
- 强烈推荐!!!Ubuntu19.04安装向日葵踩到的坑【尤其是ubuntu 19.04 遇到了libpng12.so.0 导致无法apt 更新!!!!】
- Android实现手机和电脑屏幕共享
- 7、微信小程序-wxs脚本
- 苹果手机登陆不进去显示连接服务器6,苹果6为什么显示无法连接到APPStore
- Linux 系统不能正常关机解决办法
- uniapp 跳转公众号获其他小程序
- 如何用proe/croe将三维文件转为二维CAD轴侧图
- 学习python表情包_我用Python一键保存了半佛老师所有的骚气表情包
- 学习日志——2019/07/04
- 【压缩感知合集7】压缩感知RIP有限等距性:定义解析,理解说明,数学原理推导
- 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)
- 一对一直播源码、一对一聊天app源码前端后台功能说明