文件預覽或下載中,axios設置responseType:blob時對於後臺報錯信息的捕獲兼容

項目中難免會遇到預覽文件或者下載文件的場景,如果後臺返回的是base64或者圖片格式還好說,文件信息直接放在返回body裏,作爲對象屬性給到前端,很直觀,也方便取用。

但後臺給到的是文件流就要麻煩一些了,一般來說文件流會直接凡在res.data裏

處理這種特殊返回值時需要設置axios的responseType爲blob,防止axios內部默認處理返回值,導致無法解析:

axios.get({
    url: 'xxxxxx',
    method: 'get',
    data:{},
    responseType: 'blob'
}).then(res => {
       console.log(res);
    });

當後臺解析錯誤的時候,返回的就是正常的錯誤對象,包含錯誤碼和錯誤信息,如果不做處理,那麼錯誤狀態和成功狀態都是blob類型,無法捕獲

但實際上錯誤狀態是這樣的形式:

所以需要對返回值做特殊處理,嘗試把blob轉換爲json格式,如果轉換成功則說明返回的數據不是文檔流,後臺出錯,反之則文檔轉換正常,繼續下載或預覽:

axios.get({
    url: 'xxxxxx',
    method: 'get',
    data:{},
    responseType: 'blob'
}).then(res => {
       let data = res.data;
        let fileReader = new FileReader();
        fileReader.onload = function() {
           try {
                 let jsonData = JSON.parse(this.result);
                 if (jsonData.code) {
                 // 說明是普通對象數據,後臺轉換失敗
                 // to do something
                 alert('not ok');
                 }
               } catch (err) {
                 // 解析成對象失敗,說明是正常的文件流
                 alert('ok');
               }
        };
        fileReader.readAsText(data);
    });

這樣就可以判斷返回的文件流是否是正常的了,做出合適的提示

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