纯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 相关文章推荐
srcElement表格样式
Sep 03 Javascript
点图片上一页下一页翻页效果
Jul 09 Javascript
jquery 将disabled的元素置为enabled的三种方法
Jul 25 Javascript
有道JavaScript监听浏览器的问题
Jun 23 Javascript
ExtJs的Date格式字符代码
Dec 30 Javascript
jquery异步请求实例代码
Jun 21 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 jQuery
vue实现个人信息查看和密码修改功能
May 06 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 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
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
浅析php原型模式
2014/11/25 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
python之yield表达式学习
2014/09/02 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python实现飞行棋游戏
2020/02/05 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
电厂职工自我鉴定
2014/02/20 职场文书
会计系毕业生求职信
2014/05/28 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
先进班集体申报材料
2014/12/26 职场文书
保姆聘用合同
2015/09/21 职场文书
创业计划书之酒厂
2019/10/14 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js