第1步:在后台响应response中增加:
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "utf-8"));
// 这步很重要,需要在给前端返回的请求头中添加Content-Disposition字段,否则前端会取不到Content-Disposition的信息
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
第2步:前端请求后台接口获取数据
import request from '@/router/axios'
export function handleDownNew(url,method,pdata) {
return request({
url: url,
method: method,
responseType: 'blob',
params: pdata
}).then((response) => { // 处理返回的文件流
var dispositionStr = response.headers['content-disposition'];
if (dispositionStr == null || dispositionStr === "") {
alert("下载失败!");
return;
}
// 获取文件名
let dispositionArr = dispositionStr.split(";");
// 我们的文件名可能含有汉字,因此在后端进行了UTF-8编码处理,此处进行解码
let fileName = decodeURIComponent(dispositionArr[1]);
fileName = fileName.split("fileName=")[1];
const blob = new Blob([response.data], {type: 'application/vnd.ms-excel'})
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = fileName
document.body.appendChild(link)
link.click()
window.setTimeout(function () {
URL.revokeObjectURL(blob)
document.body.removeChild(link)
}, 0)
})
}