問題:後端返回的失敗 blob 數據流, 前端如何捕獲展示 業務需求,需要後端控制文件下載頻率,用戶在短時間內不可以重覆下載文件,並返回消息提示 (剩餘 XX 秒)。前端需要把返回數據msg消息展示彈出 數據在瀏覽器的響應里可以看到 但是在列印的 res 中卻找不到對應的msg,也就沒有辦法將對應內 ...
問題:後端返回的失敗 blob 數據流, 前端如何捕獲展示
業務需求,需要後端控制文件下載頻率,用戶在短時間內不可以重覆下載文件,並返回消息提示 (剩餘 XX 秒)。前端需要把返回數據msg消息展示彈出
數據在瀏覽器的響應里可以看到
但是在列印的 res 中卻找不到對應的msg,也就沒有辦法將對應內容展示出來
解:
原來blob數據返回的數據無法直接在返回對象res中獲取,需要將獲取到的對象進行格式轉換,後才能取到其中的後端返回的消息。
請求成功發送,在 .then(res => {})中捕獲要解析的對象 也可以在響應攔截器中做處理。
// 這裡是將這部分方法做了封裝
export default exportFile(res) {
// 判斷是否存在要轉換的對象 ,如果可以下載文件則 res.data.type = application/vnd.ms-excel
if (res.data.type == 'application/json') { // 下載文件失敗
// 實例化 FileReader
const reader = new FileReader ()
// 讀取目標對象 res ,結果用字元形式表達
reader.readAsText(res.data , 'utf-8')
// 讀取完後會獲得 reader.result 要轉化為可讀取的JS對象
read.onload = function() {
const {msg} = Json.parse(reader.result)
// 彈出轉換後的 錯誤提示
Message.waring (msg)
}
return
}
// 下方為下載方法
// 下載: 獲取文件名
let fileName = decodeURIComponent(data.headers['content-disposition'].split('=')[1])
// 可以獲取當前文件的一個記憶體URL
let objectUrl = URL.createObjectURL(new Blob([data.data]))
// 創建下載
const link = document.createElement('a')
link.download = fileName
link.href = objectUrl
link.click()
}
結果:成功!!