download属性仅对同源url(协议、域名、端口完全一致)、data:或blob:协议链接生效;跨域、file://、safari全系及ie中均失效,需用fetch+blob方案替代。

download 属性本身不触发下载,它只在满足特定条件时「允许」浏览器将链接目标作为文件保存——不满足条件时,该属性会被直接忽略,点击后仍会导航或打开资源。
哪些链接能用 download?
只有同源 URL(协议、域名、端口完全一致)才生效。跨域资源即使加了 download,浏览器也会无视它,退化为普通跳转或新标签页打开。
- ✅
@#@#@#@#@#@#@#@#@#@0(同源静态文件) - ✅
@#@#@#@#@#@#@#@#@#@1(Data URL,始终同源) - ❌
@#@#@#@#@#@#@#@#@#@2(跨域,download被丢弃) - ❌
@#@#@#@#@#@#@#@#@#@3(跨域 API,无效)
download 的文件名行为细节
值为空字符串(download="")时,浏览器尝试从 URL 路径中提取文件名;提供非空值(如 download="invoice-2024.pdf")则强制使用该名称,但扩展名必须与响应内容类型兼容,否则可能被重写或拒绝。
- 服务端返回
Content-Type: application/pdf,但download="report.xlsx"→ 浏览器可能改名为report.xlsx.pdf或截断扩展名 - 服务端未返回
Content-Disposition头时,download是唯一可控文件名的方式 - 如果服务端已设置
Content-Disposition: attachment; filename="server-name.json",多数浏览器会优先采用服务端指定名,download被忽略
替代方案:当 download 不可用时怎么办?
跨域、动态生成、或需控制响应头的场景下,得绕过 <a download></a>,改用 fetch + URL.createObjectURL + <a></a> 模拟点击。
fetch('/api/export')
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'export-data.json'; // 这里命名有效
a.click();
URL.revokeObjectURL(url); // 立即释放,避免内存泄漏
});
- 注意:Blob URL 是同源的,所以
download在这里一定生效 - 不能对大文件(>500MB)频繁调用,
createObjectURL会复制数据到内存 - IE11 不支持
fetch和Blob,需用XMLHttpRequest+msSaveOrOpenBlob
真正容易被忽略的是服务端响应头和前端路径的配合关系——download 不是“下载开关”,它只是前端对同源资源的一次命名提议;实际是否下载、保存为何名,最终取决于服务端返回的 Content-Type、Content-Disposition 和浏览器策略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











