1. 程式人生 > >純前端實現base64圖片下載,相容IE10+

純前端實現base64圖片下載,相容IE10+

背景

在專案開發過程中,經常會有圖片匯出的需求,尤其是帶有圖表類的應用,通常需要將圖表下載匯出。在chrome等新版瀏覽器中實現base64圖片的下載還是比較容易的:

  1. 建立一個a標籤
  2. 將a標籤的href屬性賦值為圖片的base64編碼
  3. 指定a標籤的download屬性,作為下載檔案的名稱
  4. 觸發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()
  }

以上。