純javascript前端實(shí)現(xiàn)base64圖片下載(兼容IE10+)
背景
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)有圖片導(dǎo)出的需求,尤其是帶有圖表類的應(yīng)用,通常需要將圖表下載導(dǎo)出。
在chrome等新版瀏覽器中實(shí)現(xiàn)base64圖片的下載還是比較容易的:
- 創(chuàng)建一個(gè)a標(biāo)簽
- 將a標(biāo)簽的href屬性賦值為圖片的base64編碼
- 指定a標(biāo)簽的download屬性,作為下載文件的名稱
- 觸發(fā)a標(biāo)簽的點(diǎn)擊事件
但是這套邏輯在IE下是不行的,這樣寫(xiě)會(huì)直接報(bào)錯(cuò)。
所以IE下需要單獨(dú)處理,這里IE在處理這種文件的時(shí)候給提供了一個(gè)單獨(dú)的方法:window.navigator.msSaveOrOpenBlob(blob, download_filename)調(diào)用這個(gè)方法可以直接觸發(fā)IE的下載,還是比較方便的。具體做法如下:
// 截取base64的數(shù)據(jù)內(nèi)容(去掉前面的描述信息,類似這樣的一段:data:image/png;base64,)并解碼為2進(jìn)制數(shù)據(jù)
var bstr = atob(imgUrl.split(',')[1])
// 獲取解碼后的二進(jìn)制數(shù)據(jù)的長(zhǎng)度,用于后面創(chuàng)建二進(jìn)制數(shù)據(jù)容器
var n = bstr.length
// 創(chuàng)建一個(gè)Uint8Array類型的數(shù)組以存放二進(jìn)制數(shù)據(jù)
var u8arr = new Uint8Array(n)
// 將二進(jìn)制數(shù)據(jù)存入U(xiǎn)int8Array類型的數(shù)組中
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
// 創(chuàng)建blob對(duì)象
var blob = new Blob([u8arr])
// 調(diào)用瀏覽器的方法,調(diào)起IE的下載流程
window.navigator.msSaveOrOpenBlob(blob, 'chart-download' + '.' + 'png')
整體實(shí)現(xiàn)代碼
// 這里是獲取到的圖片base64編碼,這里只是個(gè)例子哈,要自行編碼圖片替換這里才能測(cè)試看到效果
const imgUrl = 'data:image/png;base64,...'
// 如果瀏覽器支持msSaveOrOpenBlob方法(也就是使用IE瀏覽器的時(shí)候),那么調(diào)用該方法去下載圖片
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等新版瀏覽器來(lái)處理
const a = document.createElement('a')
a.href = imgUrl
a.setAttribute('download', 'chart-download')
a.click()
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序和H5頁(yè)面間相互跳轉(zhuǎn)代碼實(shí)例
這篇文章主要介紹了微信小程序和H5頁(yè)面間相互跳轉(zhuǎn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
.net MVC+Bootstrap下使用localResizeIMG上傳圖片
這篇文章主要為大家詳細(xì)介紹了.net MVC和Bootstrap下使用 localResizeIMG上傳圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
關(guān)于TypeScript中import JSON的正確姿勢(shì)詳解
2012年10月首度對(duì)外公布typescript(當(dāng)時(shí)已經(jīng)是0.7?的版本)同時(shí)開(kāi)源,ts的編譯器是用js編寫(xiě)的(后來(lái)改成ts?),可以在線編寫(xiě)。下面這篇文章主要給大家介紹了關(guān)于TypeScript中import JSON的正確姿勢(shì),需要的朋友可以參考下。2017-07-07
微信公眾號(hào)錄音文件的播放與保存(amr文件轉(zhuǎn)mp3)
本文主要介紹了微信公眾號(hào)錄音文件的播放與保存(amr文件轉(zhuǎn)mp3),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
javascript數(shù)據(jù)結(jié)構(gòu)之串的概念與用法分析
這篇文章主要介紹了javascript數(shù)據(jù)結(jié)構(gòu)之串的概念與用法,簡(jiǎn)單講述了串的概念、功能并結(jié)合實(shí)例形式分析了基于javascript實(shí)現(xiàn)串的遍歷、比較、查找等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
深入理解Javascript中的循環(huán)優(yōu)化
這篇文章介紹了Javascript中的循環(huán)優(yōu)化,有需要的朋友可以參考一下2013-11-11
js中encode、decode的應(yīng)用說(shuō)明
這里簡(jiǎn)單介紹下js中的encode、decode的字符2012-10-10
js實(shí)現(xiàn)的真正的iframe高度自適應(yīng)(兼容IE,FF,Opera)
由于項(xiàng)目上的需要,要用一個(gè)iframe高度自適應(yīng)的功能,在google上搜了很久,找了一些修改了下。大家可以測(cè)試下。2010-03-03
JavaScript開(kāi)發(fā)網(wǎng)頁(yè)中不常用但很重要的特性用法
JavaScript中的Proxy、WeakMap、WeakSet、Generator函數(shù)、Symbol、CustomEvent、事件委托和Intl對(duì)象等特性提供了強(qiáng)大的功能,這些特性在復(fù)雜項(xiàng)目中發(fā)揮著重要作用,本文就給大家介紹了這些特性的用法,需要的朋友可以參考下2024-12-12

