纯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 表格操作(交替显示、拖动表格行、选择行等)
Jul 29 Javascript
js保存当前路径(cookies记录)
Dec 14 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
js 获取元素在页面上的偏移量的方法汇总
Apr 13 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
Angular4自制一个市县二级联动组件示例
Nov 21 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
Dec 10 jQuery
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
Apr 28 jQuery
vue分页器组件编写方法详解
Jun 28 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
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代码示例
2016/12/29 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
js实现查询商品案例
2020/07/22 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
浅谈function(函数)中的动态参数
2017/04/30 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
社会实践活动总结报告
2014/04/29 职场文书
松材线虫病防治方案
2014/06/15 职场文书
励志演讲稿大全
2014/08/21 职场文书
高中班长竞选稿
2015/11/20 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
详解Vue的列表渲染
2021/11/20 Vue.js
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫