资讯专栏INFORMATION COLUMN

纯前端实现base64图片下载,兼容IE10+

W_BinaryTree / 2453人阅读

摘要:在等新版浏览器中实现图片的下载还是比较容易的创建一个标签将标签的属性赋值为图片的编码指定标签的属性,作为下载文件的名称触发标签的点击事件但是这套逻辑在下是不行的,这样写会直接报错。

背景

在项目开发过程中,经常会有图片导出的需求,尤其是带有图表类的应用,通常需要将图表下载导出。
在chrome等新版浏览器中实现base64图片的下载还是比较容易的:

创建一个a标签

将a标签的href属性赋值为图片的base64编码

指定a标签的download属性,作为下载文件的名称

触发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()
  }

以上。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97765.html

相关文章

  • JS 下载文件方法分享(解决图片文件无法直接下载IE兼容问题)

    摘要:场景简介由于业务需要,经常遇到下载各类文件的需求,其中最头疼的莫过于前端下载图片了,直接给个图片文件地址会变成直接打开图片,而不是弹窗提示另存为,研究了下前端实现文件下载最便捷的方法还是创建标签,写入属性实现点击下载,但这在浏览器上的实现又 场景简介 由于业务需要,经常遇到下载各类文件的需求,其中最头疼的莫过于前端下载图片了,直接给个图片文件地址会变成直接打开图片,而不是弹窗提示另存为...

    awesome23 评论0 收藏0
  • 利用canvas实现图片下载功能来实现浏览器兼容问题

    摘要:前言项目中需要实现图片下载功能,第一个想到的是使用标签的属性来实现,但是在不同浏览器下测试会发现,有的浏览器无效,点击后直接预览图片,所以,上网找到了另外一种兼容不同浏览器的图片下载的方法,那就是利用来处理图片,实现下载项目中点击事件绑定点 前言:项目中需要实现图片下载功能,第一个想到的是使用a标签的download属性来实现,但是在不同浏览器下测试会发现,有的浏览器无效,点击后直接预...

    NSFish 评论0 收藏0
  • JS魔法堂之实战:前端图片预览

    摘要:一前言图片上传是一个普通不过的功能,而图片预览就是就是上传功能中必不可少的子功能了。偶然从上找到纯前端图片预览的相关资料,经过整理后记录下来以便日后查阅。类型为,表示在读取文件时发生的错误,只读。 一、前言   图片上传是一个普通不过的功能,而图片预览就是就是上传功能中必不可少的子功能了。在这之前,我曾经通过订阅input[type=file]元素的onchange事件,一旦更改路径...

    岳光 评论0 收藏0
  • 浏览器端用JS实现创建和下载图片

    摘要:尤其是通过生成文件内容,然后通过浏览器端执行下载的操作。日前,项目中就遇到了这类需求,在浏览器端实现保存当前网页为图片,然后还可以下载。提供了一种创建对象的方法,但是兼容性堪忧,绝大部分浏览器都没有实现。 问题场景 在前端很多的项目中,文件下载的需求很常见。尤其是通过JS生成文件内容,然后通过浏览器端执行下载的操作。如图片,Execl 等的导出功能。日前,项目中就遇到了这类需求,在浏览...

    blair 评论0 收藏0

发表评论

0条评论

W_BinaryTree

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<