一. 标签下载
- 一般我们会像下面这样动态创建标签,并为他追加下载链接和【fileName + fileType】
- 这里的【fileName + fileType】可选 不过当你 是下载图片资源或是pdf 那么最好加上
- 适合没有添加权限验证的服务器资源文件 (没有token)
1
2
3
4
5
6
7
8
9function download(url,fileName){
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
二. 请求数据流的方式
- downloadFile方法其实和上一个便签的下载差不多,详细介绍看注释
- exportEmp方法是axios封装过的
- 适合添加了token验证的资源文件
- 使用axios的同学,记得设置responseType: ‘blob’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34// exportEmp(params){
// return
// request({
// url: `xxxx`,
// method: 'get',
// params,
// responseType: 'blob'
// })
// }
exportEmp(url,{params})
.then(res=>{
downloadFile(res);
})
.catch(err=>{ console.log(err);})
function downloadFile(fileInfo) {
const link = document.createElement('a');
// 获取文件名
let name = fileInfo.headers['content-disposition'].split(";")[1].split("filename=")[1]
.slice(1,-1);// 去除文件名两端双引号
// 浏览器返回来的文件名是乱码的 ISO8859-1,我们要将其转换成utf-8格式
// 这里卡了很久 找了 很多资料也没有办法,最后我老大还是我老大
let fileName = Buffer.from(name, 'ascii').toString('UTF-8');
// 将数据流整合
let blob = new Blob([fileInfo.data], { type: fileInfo.data.type });
link.style.display = 'none';
// 创建本地下载链接
link.href = URL.createObjectURL(blob);
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
三. 标签下载并携带token
1 | <!-- placeholder , `click` download , `.remove()` options , at js callback , following js --> |
1 | $(document).ready(function () { |