背景
在項目開發過程中,經常會有圖片導出的需求,尤其是帶有圖表類的應用,通常需要將圖表下載導出。
在chrome等新版瀏覽器中實現base64圖片的下載還是比較容易的:
但是這套邏輯在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() }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答