項目中難免會遇到預覽文件或者下載文件的場景,如果後臺返回的是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);
});
這樣就可以判斷返回的文件流是否是正常的了,做出合適的提示