1.分析
前端可以接收二进制流文件,但是不能处理,所以如果打印数据,有结果但看起来是乱码,因此需要前端先指定返回数据类型,和后端相同则可以正常显示
2.封装导出文件的工具函数
// data为blob实例
function exportData(data, fileName = '下载') {
if (!data) {
throw new Error("文件下载失败")
}
let url = window.URL.createObjectURL(data);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
// download属性指示浏览器下载URL而不是导航到URL,提示用户将其保存为本地文件。
link.download = fileName + ".xlsx";
document.body.appendChild(link);
// 点击下载
link.click();
document.body.removeChild(link);
//释放掉blob对象
window.URL.revokeObjectURL(url);
}
3.axios封装的请求函数需要加以改动
service.interceptors.response.use( res => {
//针对blob实例单独处理
if(res.data instanceof Blob){
return res.data
}
if (res.data.code === 0) {
return res.data;
} else if (res.data.code === 401) {
showMessage.error('登录过期');
router.push('/login')
} else {
showMessage.error(res.data.msg); return res.data
}
}, () => {
showMessage.error('网络请求失败,反馈给客服');
}
);
4.封装的post函数加以改动
const post = (url, data, config = {}) => {
config.url = url
config.data = data
config.method = 'post'
//使用url判断,如果是下载接口,则添加响应头为blob,以保持后后端返回数据类型一致
if(url === '/xls/FileDownload/BssOrder') {
config.responseType = 'blob'
}
return service(config) }