纯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 基础学习笔记之文档处理
May 29 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 Javascript
javascript从右边截取指定字符串的三种实现方法
Nov 29 Javascript
js中文逗号转英文实现
Feb 11 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
es5 类与es6中class的区别小结
Nov 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python删除windows垃圾文件的方法
2015/07/14 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
《小熊住山洞》教学反思
2014/02/21 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
亮剑观后感600字
2015/06/05 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫