download属性仅对同源静态资源生效,跨域链接、后端接口或blob url需分别通过服务端content-disposition响应头、js blob构造或ios长按下载等方式实现下载。

download 属性为什么有时不生效
直接给 @#@#@#@#@#@#@#@#@#@0,点击就会触发下载。加上 download 也没坏处,但不起决定作用。
注意:Nginx / CDN 可能缓存或覆盖响应头,务必检查真实响应中是否包含 Content-Disposition —— 用浏览器 DevTools 的 Network 面板看 Headers 选项卡。
移动端 Safari 的特殊处理
iOS Safari 对 <a download></a> 和 Blob URL 下载都限制极严:无法通过 JS 触发 .click() 下载,也不支持 download 属性(即使同源)。
目前唯一可靠方案是后端提供带 Content-Disposition 的直链,并引导用户长按链接选择“下载”。前端无法绕过。
- 不要在 iOS 上尝试用
location.href = blobUrl或window.open(blobUrl)代替<a>.click()</a>,它们都不触发下载 - 如果必须前端生成文件,可考虑将内容 base64 编码后拼成 data URL:
href="data:text/csv;base64,...",但仅适用于小文件(iOS 对 data URL 长度敏感) - 大文件或稳定体验要求高时,放弃前端下载,改用后端直出 + 用户手动操作
真正麻烦的从来不是怎么写那行 download,而是搞清当前资源来源、浏览器能力边界和服务端是否配好了头——三者缺一,都会卡在“点一下没反应”。
const data = JSON.stringify({name: "test", value: 42});
const blob = new Blob([data], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "config.json";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url); // 及时释放引用前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











