Blob用于前端内存中处理二进制数据,支持构造、转换、预览与下载;核心流程为数据→Blob→createObjectURL→a.download,需指定正确type并及时revoke;大文件应分片处理,旧浏览器需Blob.js补丁。

支持,但不是直接“操作文件系统”,而是通过 Blob 对象在内存中构造、转换、预览或下载二进制数据——所有现代浏览器(IE10+)原生支持,无需额外库。
用 Blob 创建可下载的文件(比如 Excel/PDF)
后端不参与时,前端生成文件并触发下载的核心路径是:数据 → ArrayBuffer/Uint8Array/String → Blob → URL.createObjectURL() → a.download。
- 必须指定准确的
type,否则 Chrome 可能拒绝下载或打开为乱码,例如 PDF 要用'application/pdf',Excel 用'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' -
Blob构造函数接受数组,但注意:传入ArrayBuffer时不能加括号包裹,new Blob([arrayBuffer], ...)正确,new Blob([new Uint8Array(arrayBuffer)], ...)也行,但new Blob(arrayBuffer, ...)会报错 - 下载后记得立刻调用
URL.revokeObjectURL(url),否则内存不会释放,尤其在循环生成多个文件时容易卡顿
用 Blob 预览本地文件(图片/视频/PDF)
用户选中 <input type="file"> 后,files[0] 本身就是 Blob 的子类 File,可直接用于预览。
- 图片和视频:赋给
img.src或video.src即可,不需要转成 base64 - PDF 预览需依赖
<iframe>或第三方库(如 pdf.js),因为iframe.src = blobUrl在部分 iOS Safari 版本中不生效,此时要 fallback 到embed或服务端代理 - 不要在
change回调里反复调用createObjectURL却不 revoke,一个文件对应一个 URL,重复创建会堆积无效引用
Blob 处理大文件时的内存与分片陷阱
单个 Blob 理论上限约 500MB,但实际受浏览器可用内存限制;超过 100MB 就可能卡死页面,尤其低端设备。
立即学习“前端免费学习笔记(深入)”;
- 避免把整个大文件读进内存再构造
Blob:用File.slice()分段处理,例如上传前每 2MB 一片,逐片发请求 - 不要用
FileReader.readAsDataURL()处理大文件——base64 编码体积膨胀 33%,且会阻塞主线程;优先用readAsArrayBuffer()+Blob - Stream API(
Response.body、ReadableStream)更适合流式处理,但 IE 完全不支持,如需兼容旧环境,仍得靠Blob.slice()手动切片
老旧浏览器(IE9 及以下)怎么用 Blob?
IE10+ 原生支持 Blob 和 URL.createObjectURL;IE9 及更早版本不支持,必须引入 Blob.js 补丁。
- 引入顺序很重要:必须在任何使用
Blob的脚本之前加载<script src="Blob.js"></script> -
Blob.js会覆盖原生Blob构造函数,但只模拟了基本功能,不支持Blob.arrayBuffer()(ES2017+ 新增方法),若代码中用了这个方法,需降级改用FileReader - IE6–9 中
URL.createObjectURL实际调用的是window.navigator.msSaveOrOpenBlob(),因此a.download属性无效,必须用msSaveBlob()触发保存
真正难的不是语法,是判断什么时候该用 Blob.slice()、什么时候该换 Stream、以及哪些老设备连 Blob.js 都救不了——这些边界往往只在真实机型上暴露。



















