直接请求然后下载一些文件到本地,如果直接发送请求,后端返回文件流,这个时候在http响应报文中是看不到具体的返回data的。所以首先我们需要在请求的时候设置 responseType: 'blob',这里涉及到get请求和post请求的一些区别,例如get请求:
function downFile(params) {
return http({
url: '/downFile',
method: 'GET',
params,
responseType: 'blob',
headers: {
'content-disposition': 'attachment;filename=total.xls',
'content-type': 'application/octet-stream;charset=utf-8'
}
});
}
这样就能获取到响应报文为Blob格式,接下来就需要操作响应体:
function download(data, filename = '好一个大憨憨') {
console.log(data, 'resss');
// var blob = new Blob([data], { type: 'application/vnd.ms-excel' }); //接收的是blob,若接收的是文件流,需要转化一下
if (typeof window.chrome !== 'undefined') {
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));
}
}
这样的方式前端能控制下载文件的名字
其实这种get请求有一种更简单的方式,就是如果直接在浏览器上输入这个请求url其实也可以直接下载,例如:
let token = location.getItme('项目token')
window.open(`api/apply/downFile?token=${token}`);
这种情况是直接下载文件,文件名是后端上传到服务器的源文件 这种其实更简单啦,相对地址会自动获取域名的啦!
好啦! 工作中遇到的一些小坑,然后埋完记录一下心得。江湖路远-再见咯!