最常用、最可靠的方式是通过Blob对象配合a标签download属性实现前端文件下载:先用new Blob([content], {type})创建Blob,再用URL.createObjectURL生成临时URL,通过动态创建a标签并设置href和download属性模拟点击触发下载,最后调用URL.revokeObjectURL释放内存。

在浏览器中,用 JavaScript 生成并下载文件最常用、最可靠的方式就是通过 Blob 对象配合 a 标签的 download 属性。它不依赖后端,纯前端即可完成文本、JSON、CSV、甚至简单图片等文件的即时创建与下载。
1. 创建 Blob 对象
Blob 表示一个不可变的、原始数据的类文件对象。你可以传入一个数据数组(如字符串、Uint8Array)和可选的 MIME 类型:
例如生成一个 UTF-8 编码的文本文件:
const content = "姓名,年龄\n张三,25\n李四,30";
const blob = new Blob([content], { type: "text/csv;charset=utf-8" });
注意:
– 字符串默认按 UTF-8 编码,但 CSV/Excel 打开中文乱码时,常需加 BOM 头(见下文);
– 图片或二进制数据可用 Uint8Array、ArrayBuffer 构造;
– MIME 类型影响下载后的默认文件名后缀和打开方式(如 "text/plain"、"application/json")。
2. 创建临时 URL 并触发下载
Blob 本身不能直接下载,需用 URL.createObjectURL() 创建一个指向它的临时地址:
立即学习“Java免费学习笔记(深入)”;
HISUI 前端框架基础开发指南。HISUI 是基于 easyui 二次开发的 jQuery UI 组件库,专为医疗信息系统设计。当涉及 HISUI 组件开发、jQuery easyui 表格/表单/布局/窗口、医疗系统前端页面编写时使用此 skill。 涵盖 40 个组件的官方文档参考,支持声明式与编程式两种初始化方式,提供 $cm/$m 数据访问方法。
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "users.csv"; // 指定下载的文件名
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url); // 用完及时释放内存
关键点:
– a.download 属性只对同源 URL 生效(blob: 协议是安全的);
– 必须将 a 插入 DOM 才能触发点击(部分浏览器限制);
– 调用 URL.revokeObjectURL() 可避免内存泄漏,尤其频繁生成时。
3. 处理中文乱码(特别是 CSV)
Excel 默认用 ANSI 打开 CSV,导致 UTF-8 中文显示为乱码。解决办法是在内容开头添加 UTF-8 BOM 头(\uFEFF):
const content = "\uFEFF姓名,年龄\n张三,25\n李四,30";
const blob = new Blob([content], { type: "text/csv;charset=utf-8" });
这样 Excel 就能正确识别为 UTF-8 编码。注意 BOM 只加一次,且必须在最开头。
4. 下载 JSON 或其他格式示例
生成 JSON 文件也很简单:
const data = { name: "王五", score: 92 };
const blob = new Blob([JSON.stringify(data, null, 2)], {
type: "application/json"
});
const url = URL.createObjectURL(blob);
const a = Object.assign(document.createElement("a"), {
href: url,
download: "info.json"
});
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
如果要下载 base64 图片,先用 fetch 或 atob 解码成 Uint8Array,再传给 Blob 构造函数。

















