纯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 类方法定义还是有点区别
Apr 15 Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
JS多物体 任意值 链式 缓冲运动
Aug 10 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
Jan 06 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
jQuery中index()方法用法实例
Dec 27 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
JS如何判断json是否为空
Jul 06 Javascript
单行 JS 实现移动端金钱格式的输入规则
May 22 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
Jun 11 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 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
用户的详细注册和判断
2006/10/09 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
Javascript MD4
2006/12/20 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
python小白学习包管理器pip安装
2020/06/09 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
JNI的定义
2012/11/25 面试题
如何写你的创业计划书
2014/01/07 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
年终工作总结范文2014
2014/11/27 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
Java 死锁解决方案
2022/05/11 Java/Android