以前由于懒,异步请求的下载都是直接写在a标签里,请求权限让后端作特殊处理判断,就像这样
<a href="getRequestUrl">点击下载</a>
如今以为这样处理不太好,一个是后端权限要作单独判断,另外一个是若是调用接口报错就没办法处理了,研究以后修改了一下,项目用了axios这个lib,因此是针对axios的request和response作了修改,不过对于原生写法和其余库,原理是同样的
function exportData(p) { return axios({ url: '/data/export', method: 'get', params: p, responseType: 'blob' }); }
由于项目里用了response拦截器来处理响应,因此我在拦截器里作了处理,也能够单独处理。javascript
axios.interceptors.response.use( response=> { // ... // Blob类型处理 let checkType = response.config.responseType; if(checkType === "blob" && res.type === 'application/octet-stream') { // 正常下载时直接返回响应数据 return response.data } else if(checkType === "blob" && res.type === 'application/json') { // 请求出错时,接口返回的内容是json,因而将blob中的内容取出 let reader = new FileReader(); reader.onload = function(event){ let content = reader.result; // blob中的内容 Message({ message: JSON.parse(content).desc, type: 'error', duration: 5 * 1000 }) }; reader.readAsText(response.data); return Promise.reject('error') } // ... }, error => { // ... } )
exportData(para).then(res => { let content = res; let aTag = document.createElement('a'); let blob = new Blob([content]); aTag.download = 'Datas.xlsx'; // 也能够让后端设置文件名,经过headers返回 aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(blob); }).finally(() => { })
参考博客: https://www.cnblogs.com/coder...