背景
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)有圖片導(dǎo)出的需求,尤其是帶有圖表類的應(yīng)用,通常需要將圖表下載導(dǎo)出。
在chrome等新版瀏覽器中實(shí)現(xiàn)base64圖片的下載還是比較容易的:
但是這套邏輯在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í)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。
新聞熱點(diǎn)
疑難解答