💡 前言
在 Web 开发中,文件下载是高频需求:导出 Excel、生成 PDF、保存用户头像…… 面对这类需求,前端开发者通常有两种实现思路:
- 方案 A:直接跳转到后端提供的下载链接(如
window.location.href = '/download') - 方案 B:前端通过
fetch获取数据,转为Blob,再用<a download>触发下载
很多初学者会疑惑:
- 这两种方式有什么本质区别?
- 为什么有些场景必须用其中一种?
- 它们都是'真正的下载'吗?是不是二进制流?
本文将从原理、兼容性、性能、适用场景四个维度,彻底讲清这两种下载方式的异同,并给出生产环境的最佳实践建议。
🔬 一、什么是'文件下载'?
首先明确:所有真正的文件下载,底层都是 HTTP 二进制流传输。
当浏览器收到一个 HTTP 响应,如果满足以下条件之一,就会触发'下载'行为:
- 浏览器无法识别
Content-Type(如application/octet-stream); - 用户手动右键 → '另存为'。
响应头包含:
Content-Disposition: attachment; filename="xxx.xlsx"
✅ 所以,是否'下载'由服务器响应头决定,而非前端代码。
🧩 二、方式一:直接 URL 下载(推荐)
✅ 实现方式
// 前端 window.location.href = '/api/export/report';
// 或 <a href="/api/export/report" target="_blank">下载</a>
🖥️ 后端关键配置
HTTP/1.1 200 OK
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename*=utf-8''%E8%B4%A2%E5%8A%A1%E6%8A%A5%E8%A1%A8.xlsx
[二进制文件内容...]
🔁 工作流程
- 浏览器直接向
/api/export/report发起 GET 请求;


