问题描述
点击链接下载文件时,如果是txt这种能够在浏览器直接打开的文件,会被直接打开,而不是下载。
原因
浏览器的机制,可以在链接上右击,然后选择 链接另存为
(chrome是这个名称,firefox是 从链接另存文件为
,名字不同,功能一样),可以下载文件。
解决
一、传统解决方案
后台设置response的类型,示例如下:
response.addHeader("Content-Disposition","attachment;filename="文件名称.txt");
二、html5解决方案
MDN对a的download属性的说明:
具体做法是:在a标签上添加download
属性,可以只写download
,也可以写成download='文件名'
,示例如下:
< a href='./test.txt' download>下载</ a>
< a href='./test.txt' download='aaa.txt'>下载</ a>
遇到的坑:
现象:在本地测试,或者引用跨域的文件,即使加上download
属性依旧会自动打开txt!
原因:download
只有在同源文件上可以起作用,跨域 会导致download
属性失效。
解决:
- 使用同源文件,如果需要跨域,请参考传统解决方案;
- 就是mdn里提到的,使用blob:URL和data:URL ,先发送一个
responseType= 'blob'
的请求,然后由后台返回一个文件流,通过URL.createObjectURL(new Blob([response.data]))
的方式把返回结果在前端生成文件。