纯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 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
基于jquery的网页SELECT下拉框美化代码
Oct 28 Javascript
获得Javascript对象属性个数的示例代码
Nov 21 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
Javascript获取随机数的实现方法
Jun 22 Javascript
Vue表单实例代码
Sep 05 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
jquery实现页面加载效果
Feb 21 Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 Javascript
富文本编辑器vue2-editor实现全屏功能
May 26 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 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
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
JavaScript网页定位详解
2014/01/13 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python赋值操作方法分享
2013/03/23 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
怎样比较两个类型为String的字符串
2016/08/17 面试题
EJB3推出JPA的原因
2013/10/16 面试题
物业工作计划书
2014/01/10 职场文书
犯错检讨书
2014/02/21 职场文书
工程建设实施方案
2014/03/14 职场文书
警校毕业生自我评价
2014/04/06 职场文书
优秀教师先进材料
2014/12/16 职场文书
写给医生的感谢信
2015/01/22 职场文书
世界文化遗产导游词
2015/02/13 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android