純javascript前端實(shí)現(xiàn)base64圖片下載(兼容IE10+)
背景
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)有圖片導(dǎo)出的需求,尤其是帶有圖表類(lèi)的應(yīng)用,通常需要將圖表下載導(dǎo)出。
在chrome等新版瀏覽器中實(shí)現(xiàn)base64圖片的下載還是比較容易的:
- 創(chuàng)建一個(gè)a標(biāo)簽
- 將a標(biāo)簽的href屬性賦值為圖片的base64編碼
- 指定a標(biāo)簽的download屬性,作為下載文件的名稱(chēng)
- 觸發(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)容(去掉前面的描述信息,類(lè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類(lèi)型的數(shù)組以存放二進(jìn)制數(shù)據(jù) var u8arr = new Uint8Array(n) // 將二進(jìn)制數(shù)據(jù)存入U(xiǎn)int8Array類(lèi)型的數(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)文章
使用 JavaScript 創(chuàng)建可維護(hù)的幻燈片效果代碼
顯然,效果很實(shí)用。對(duì)于這個(gè)效果,我們并不解釋如何去使用效果庫(kù),而是講解如何創(chuàng)建類(lèi)似的效果,并保持他的可用性,分離式(unobtrusive),可維護(hù)性(讓未來(lái)的維護(hù)者,在不需要修改你的腳本的情況下,修改圖片,外觀(guān)或文本標(biāo)簽)。2008-06-06學(xué)習(xí)JavaScript設(shè)計(jì)模式(鏈?zhǔn)秸{(diào)用)
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計(jì)模式,其中重點(diǎn)介紹鏈?zhǔn)秸{(diào)用,感興趣的小伙伴們可以參考一下2015-11-11微信小程序轉(zhuǎn)換uniapp的遷移步驟以及遇到的問(wèn)題總結(jié)
最近公司有個(gè)需求,第一次遇到,把原生的微信小程序代碼轉(zhuǎn)換為uni-app項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于微信小程序轉(zhuǎn)換uniapp的遷移步驟以及遇到問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07基于JavaScript 實(shí)現(xiàn)拖放功能
本文通過(guò)實(shí)例代碼給大家介紹了JavaScript 實(shí)現(xiàn)拖放功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09javascript寫(xiě)的簡(jiǎn)單的計(jì)算器,內(nèi)容很多,方法實(shí)用,推薦
最近用javascript寫(xiě)了一個(gè)簡(jiǎn)單的計(jì)算器,自己測(cè)試感覺(jué)還好,代碼都給了注釋?zhuān)浅2诲e(cuò),推薦大家學(xué)習(xí)。2011-12-12原生js實(shí)現(xiàn)移動(dòng)端觸摸輪播的示例代碼
下面小編就為大家分享一篇原生js實(shí)現(xiàn)移動(dòng)端觸摸輪播的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12JS中通過(guò)slice()&substring()截取字符串前幾位的方法
在Javascript使用字符串中,我們不一定需要全部的字符串,這時(shí)就需要截取字符串,本文主要介紹js中截取字符串前幾位的兩種方法:1、使用slice() 方法;2、使用substring() 方法,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12(function(){})()的用法與優(yōu)點(diǎn)
(function(){})()的用法與優(yōu)點(diǎn)...2007-03-03JavaScript Array Flatten 與遞歸使用介紹
用 JavaScript 將 [1,2,3,[4,5, [6,7]], [[[8]]]] 這樣一個(gè) Array 變成 [1,2,3,4,5, 6,7,8] 呢?傳說(shuō)中的 Array Flatten2011-10-10