纯javascript前端实现base64图片下载(兼容IE10+)


Posted in Javascript onSeptember 14, 2018

背景

在项目开发过程中,经常会有图片导出的需求,尤其是带有图表类的应用,通常需要将图表下载导出。

在chrome等新版浏览器中实现base64图片的下载还是比较容易的:

  1. 创建一个a标签
  2. 将a标签的href属性赋值为图片的base64编码
  3. 指定a标签的download属性,作为下载文件的名称
  4. 触发a标签的点击事件

但是这套逻辑在IE下是不行的,这样写会直接报错。

所以IE下需要单独处理,这里IE在处理这种文件的时候给提供了一个单独的方法:window.navigator.msSaveOrOpenBlob(blob, download_filename)调用这个方法可以直接触发IE的下载,还是比较方便的。具体做法如下:

// 截取base64的数据内容(去掉前面的描述信息,类似这样的一段:data:image/png;base64,)并解码为2进制数据
var bstr = atob(imgUrl.split(',')[1]) 
// 获取解码后的二进制数据的长度,用于后面创建二进制数据容器
var n = bstr.length 
// 创建一个Uint8Array类型的数组以存放二进制数据
var u8arr = new Uint8Array(n) 
// 将二进制数据存入Uint8Array类型的数组中
while (n--) {
 u8arr[n] = bstr.charCodeAt(n) 
}
// 创建blob对象
var blob = new Blob([u8arr])
// 调用浏览器的方法,调起IE的下载流程
window.navigator.msSaveOrOpenBlob(blob, 'chart-download' + '.' + 'png')

整体实现代码

// 这里是获取到的图片base64编码,这里只是个例子哈,要自行编码图片替换这里才能测试看到效果
 const imgUrl = 'data:image/png;base64,...'
 // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候),那么调用该方法去下载图片
 if (window.navigator.msSaveOrOpenBlob) {
  var bstr = atob(imgUrl.split(',')[1])
  var n = bstr.length
  var u8arr = new Uint8Array(n)
  while (n--) {
   u8arr[n] = bstr.charCodeAt(n)
  }
  var blob = new Blob([u8arr])
  window.navigator.msSaveOrOpenBlob(blob, 'chart-download' + '.' + 'png')
 } else {
  // 这里就按照chrome等新版浏览器来处理
  const a = document.createElement('a')
  a.href = imgUrl
  a.setAttribute('download', 'chart-download')
  a.click()
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
Javascript面向对象编程
Mar 18 Javascript
javascript变量作用域使用中常见错误总结
Mar 26 Javascript
jquery鼠标停止移动事件
Dec 21 Javascript
Bootstrap下拉菜单效果实例代码分享
Jun 30 Javascript
D3.js实现折线图的方法详解
Sep 21 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
layui 阻止图片上传的实例(before方法)
Sep 26 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
在js中修改html body的样式
Nov 11 Javascript
react 国际化的实现代码示例
Sep 14 #Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 #Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 #Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
Sep 14 #Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 #Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
Sep 14 #Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 #Javascript
You might like
各种咖啡的英文名子是什么
2021/03/03 新手入门
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
js静态作用域的功能。
2006/12/25 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
python多线程扫描端口示例
2014/01/16 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
pygame实现打字游戏
2021/02/19 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
法国珠宝店:CLEOR
2017/01/29 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
初中三好学生事迹材料
2014/01/13 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
幼儿教师个人总结
2015/02/05 职场文书
礼貌问候语大全
2015/11/10 职场文书
2019年工作总结范文
2019/05/21 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
索尼ICF-5900W收音机测评
2022/04/24 无线电