最早开始接触下载是后端直接返回一个链接,通过a标签直接下载,甚至再简单点直接window.open直接下载。恰巧今天第一次经历文件流下载,代码如下
this.$http.get(`xxx`).then((resp) => {
console.log(resp);
// debugger
let blob = new Blob([resp.data],{
type: 'application/octet-stream;charset=UTF-8'
})
let contentDisposition = resp.headers['content-disposition'] || '';
let filename = contentDisposition.split('filename=')[1];
filename = filename.replace(/"/g,"")
let link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
window.URL.revokeObjectURL(link.href);
// hack for firefox
setTimeout(function(){
document.body.removeChild(link);
}, 1000);
})
.catch((error) => {
});
但是代码下载的文件一直提示文件已损坏,打不开,修复也不行,通过查阅相关资料以后才知道请求头需要加一个对象,告诉文件responseType为blob,然后就没问题了
this.$http.get(`xxx`,{responseType: 'blob'}).then((resp) => {
console.log(resp);
// debugger
let blob = new Blob([resp.data],{
type: 'application/octet-stream;charset=UTF-8'
})
let contentDisposition = resp.headers['content-disposition'] || '';
let filename = contentDisposition.split('filename=')[1];
filename = filename.replace(/"/g,"")
let link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
window.URL.revokeObjectURL(link.href);
// hack for firefox
setTimeout(function(){
document.body.removeChild(link);
}, 1000);
})
.catch((error) => {
});
axios文件
export const get = (url, params) => {
if(oAuth.getLocalStorage('access_token') != null) {
axios.defaults.headers.common['Authorization'] = 'Bearer '+oAuth.getLocalStorage('access_token');
if (!params){
params={};
}
}
// return axios.get(url,{params})
return axios.get(url, {params})
}
又是一次小白的自我检讨,各位拜拜!