有一個業務場景:批量導入數據時,導入excel,如果成功,后台返回成功的json數據。如果批量導入失敗,后端會返回excel文件流告知是哪幾條數據出錯。
也許你會遇到這樣的問題:
(1)如果不在請求中設置responseType: 'blob' 文件流可以正常下載,但是打開excel時會報錯。我們下載的文件是有問題的。
所以我們必須在請求中設置responseType: 'blob' 。
(2)這時候就來了另外一個問題。加了responseType: 'blob' 之后,原本正確場景返回的json數據被改成了blob數據了。所以我們要針對返回的數據做不同的處理。正確時我們需要將blob數據轉為json數據(type值為:application/json,以此作為判斷條件)
// 如果返回的是json格式,將blob數據轉為json數據。 if (res.data.type === 'application/json') { let reader = new FileReader() reader.readAsText(res.data, 'utf-8') reader.onload = (e) => { // JSON.parse(reader.result) 轉譯后的json數據 res.data = JSON.parse(reader.result) // 處理相關邏輯... } } else { // 文件流,下載文件邏輯... }
這個地方稍有不注意就會遇到 Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'. 其實就是太粗心的問題哦~
reader.readAsText(res.data, 'utf-8') // res.data 取值取錯就會報以上的問題,所以一點過要認真吶~~~