纯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 类定义的4种方法
Sep 12 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
Apr 02 Javascript
jquery与prototype框架的详细对比
Nov 21 Javascript
不要使用jQuery触发原生事件的方法
Mar 03 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
jquery+ajax实现直接提交表单实例分析
Jun 17 Javascript
jQuery自定义组件(导入组件)
Nov 08 Javascript
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 Javascript
深入理解Vue 单向数据流的原理
Nov 09 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
react中useState使用:如何实现在当前表格直接更改数据
Aug 05 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
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
JS location几个方法小姐
2008/07/09 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
Python的Flask开发框架简单上手笔记
2015/11/16 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python numpy数组中的复制知识解析
2020/02/03 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
python基于opencv 实现图像时钟
2021/01/04 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
妈妈的账单教学反思
2014/02/06 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL