纯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 相关文章推荐
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
Sep 29 Javascript
JavaScript跨域方法汇总
Oct 16 Javascript
浅谈Javascript中Object与Function对象
Sep 26 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
axios基本入门用法教程
Mar 25 Javascript
AngularJS实现单一页面内设置跳转路由的方法
Jun 28 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
May 05 Javascript
redux.js详解及基本使用
May 24 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
Apr 09 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 深入理解strtotime函数的使用详解
2013/05/23 PHP
深入理解PHP中的global
2014/08/19 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript中的if语句使用介绍
2013/11/20 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
详解supervisor使用教程
2017/11/21 Python
python调用摄像头显示图像的实例
2018/08/03 Python
python实现KNN分类算法
2019/10/16 Python
python读取Kafka实例
2019/12/23 Python
如何基于python测量代码运行时间
2019/12/25 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
2014年信贷员工作总结
2014/11/18 职场文书
幼儿园辞职信
2015/05/13 职场文书
九年级语文教学反思
2016/03/03 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
springboot用户数据修改的详细实现
2022/04/06 Java/Android