主要原理
前端
1 2
| <a href="http://xxxx.com/yyy.txt" downlod="yyy.txt"></a>
|
后端
后端的设置主要是为了当浏览不支持 download 属性的时候的兼容性。
1 2 3
| res.setContentType("application/octet-stream"); res.addHeaders("Content-Disposition", "attachment;filename=" + filename); res.addHeaders("Content-Length", content.length);
|
参考
推荐的 a 标签的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
var fileDownload = function(url, filename) { var hiddenALink = document.createElement('a'); hiddenALink.href = url; hiddenALink.download = filename; hiddenALink.style.display = 'none';
document.body.appendChild(hiddenALink); hiddenALink.click(); document.body.removeChild(hiddenALink); }
|
在 Chrome 中 appendChild(hiddenALink) 的操作可以省去直接 click(),但是在 FireFox 中却不可以,必须要 appendChild() 才可以 click(),具体可参考 stackoverflow programmatical-click-on-a-tag-not-working-in-firefox。
优点
缺点
- 需要传递较多参数时略麻烦
- 某些情况下的鉴权会不可用
当点击下载,出现的却是 html 文件或者 json 文件的时候,考虑下是不是要放开后端的 security 匿名访问。
ajax 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 35 36 37 38 39 40 41 42 43 44
|
var fileDownload = function(url, filename) {
axios.get(url, { responseType: 'blob' }).then(res => { const content = res.data;
const furl = window.URL.createObjectURL(content);
download0(furl, filename); }) }
var download0 = function(url, filename) {
var a = document.createElement('a'); a.href = url; a.download = filename; a.style.display = 'none';
document.body.appendChild(a); a.click(); document.body.removeChild(a); }
|
优点
缺点
- 超大文件的时候,对客户端的内存不友好
- 超大文件在页面没有做关于下载进度处理的情况下,看不到下载进度,体验不友好
适用场景