后端:响应的时候给请求头里面加入标记字段"nameSpace=behind"
response.setContentType("application/octet-stream"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-Disposition", "attachment;nameSpace=behind;filename="+ URLEncoder.encode("${excelName}.xlsx", "UTF-8")); OutputStream output = response.getOutputStream(); wb.write(output); output.flush();
前端:
- 解析请求头里面的nameSpace用于判断是需要前端命名还是后端命名
service.interceptors.response.use(
response => {
// dataAxios 是 axios 返回数据中的 data
const dataAxios = response.data;
// 这个状态码是和后端约定的
const {code} = dataAxios;
// 根据 code 进行判断
// console.log("---code----------",code)
if (code === undefined) {
// 如果没有 code 代表这不是项目后端开发的接口
//1、解析请求头,判断命名方式
let contentDisposition=response.headers['content-disposition']
if(contentDisposition&&contentDisposition.indexOf("nameSpace=behind")){
let temp =contentDisposition.split(";")[2].split("filename=")[1];
let fileName="None"
if(temp){
//对文件名乱码转义--【Node.js】使用iconv-lite解决中文乱码
let iconv = require('iconv-lite');
iconv.skipDecodeWarning = true;//忽略警告
fileName = decodeURIComponent(temp);
}else{
fileName='None'
}
return {Blob:dataAxios,fileName:fileName};
}else{
return dataAxios;
}
}else if(code === 403){
router.push('/login');
} else {
// 有 code 代表这是一个后端接口 可以进行进一步的判断
switch (code) {
case -1:
// [ 示例 ] code === -1 代表访问正常,但是后台业务错误返回错误信息
errorCreate(` ${dataAxios.data.msg}`);
break;
case 0:
// [ 示例 ] code === 0 代表没有错误
return dataAxios.data;
case 'xxx':
// [ 示例 ] 其它和后台约定的 code
errorCreate(`[ code: xxx ] ${dataAxios.msg}`);
break;
default:
// 不是正确的 code
errorCreate(`${dataAxios.msg}`);
break;
}
}
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = 'Request error';
break;
case 401:
error.message = 'Unauthorized, please login';
break;
case 403:
error.message = 'Access denied';
break;
case 404:
error.message = `Request address error: ${error.response.config.url}`;
break;
case 408:
error.message = 'Request timeout';
break;
case 500:
error.message = 'Server internal error';
break;
case 501:
error.message = 'Service not implemented';
break;
case 502:
error.message = 'Bad Gateway';
break;
case 503:
error.message = 'Service not available';
break;
case 504:
error.message = 'Gateway timeout';
break;
case 505:
error.message = 'The HTTP version is not supported';
break;
default:
break;
}
}
errorLog(error);
return Promise.reject(error);
}
);
修改下载确认框中的文件名称
downloadUtil.download = function (res, filename) {
let dataType=AppConstant.utils.typeOf(res)
let data=res
debugger
if(dataType==="Object"){
filename=res.fileName
data=res.Blob
}else{
data=res
}
//var blob = new Blob([data], {type: 'application/vnd.ms-excel'})接收的是blob,若接收的是文件流,需要转化一下
if (typeof window.chrome !== 'undefined') {
// Chrome version
var link = document.createElement('a');
link.href = window.URL.createObjectURL(data);
link.download = filename;
link.click();
} else if (typeof window.navigator.msSaveBlob !== 'undefined') {
// IE version
var blob = new Blob([data], {type: 'application/force-download'});
window.navigator.msSaveBlob(blob, filename);
} else {
// Firefox version
var file = new File([data], filename, {type: 'application/force-download'});
window.open(URL.createObjectURL(file));
}
}