纯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 相关文章推荐
jquery 简短右键菜单 多浏览器兼容
Jan 01 Javascript
Jquery 获得服务器控件值的方法小结
May 11 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
Sep 01 Javascript
学习使用Bootstrap页面排版样式
May 11 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
用js编写留言板
Mar 17 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 jQuery
Vue实现导航栏菜单
Aug 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
Linux下php5.4启动脚本
2014/08/03 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
python逐行读取文件内容的三种方法
2014/01/20 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
教师个人鉴定材料
2014/02/08 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
大学计划书范文800字
2014/08/14 职场文书
小学师德师风整改措施
2014/10/27 职场文书
合理化建议书
2015/02/04 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
SpringBoot详解执行过程
2022/07/15 Java/Android