接收文件流並導出至excel以及對二進制文件流內容的校驗

廢話不說 上代碼

const handleRightDownload = async () => {
  axios({
    method: 'post',
    url: '/my/handleAndDownloadExcel', // 請求地址 這裏寫後端的地址,注意加上`/api`以確保最終的請求能被替換掉 ,/api表示server要替換的前綴 '/api' ->  ''
    data: {
       fileid:my.id  //額外參數
    },  
    headers: {
      // 請求頭
      Authorization: `Bearer ${token}`,   // 這裏要加上token防止401無權限
      'Content-Type': 'application/json;charset=utf-8'
    },
    responseType: 'blob' // 表明返回服務器返回的數據類型,關鍵代碼,不加則會返回json格式
  }).then(async (res) => {
    console.log('res :>> ', res)
    console.log(' res.data :>> ', res.data)
    const blob = new Blob([res.data], {
      type: res.headers['content-type']
    })
    const reader = new FileReader()
//此if語句爲了判斷返回的二進制對象是不是正常的文件流形式, 如果後端返回的是{code:-1,msg:`模板錯誤` }諸如此類則會在這裏被捕獲到,也就沒必要走下去了
    if (blob.type.indexOf('application/json') > -1) {
      reader.readAsText(blob)
      reader.onload = (e) => {
        let text = e.target.result
        if (typeof text == 'string') {
          var errInfo = JSON.parse(text)
          MessagePlugin.error({
            content: errInfo.msg,
            duration: 2000
          })
        }
      }
      return
    }
// 正常態,則開始本地下載流程
    const newBlob = res.data
    reader.readAsDataURL(newBlob) // 轉換爲base64,可以直接放入a標籤href
    reader.onload = function (e) {
      var a = document.createElement('a') // 轉換完成,創建一個a標籤用於下載
      a.download = `${currentFileName.value}.xlsx`
      a.href = e.target.result
      document.body.appendChild(a)
      a.click()
      a.remove()
    }
    MessagePlugin.success(`文件:${currentFileName.value}.xlsx導出成功`)
  })

  //
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章