Blob URL 是临时地址,让浏览器原生功能访问 Blob 或 File。它看起来像 blob:https://example.com/...,但并不对应公共服务器文件。
对象 URL 连接 JavaScript 管理的二进制数据与 img、video、iframe、Worker 和下载链接,无需把每个字节转换成长 Base64 文本。
createObjectURL 创建了什么
URL.createObjectURL(blob) 在当前浏览器上下文登记 Blob 并返回不透明标记。元素请求时,浏览器把它解析到字节和 MIME。
这个字符串是能力引用,不是编码或文件路径,不能解析或持久化为永久地址。
预览与下载链路
图片工具把 WebP Blob URL 赋给 img.src;ZIP 工具把压缩包 URL 赋给带 download 文件名的链接。创建 URL 是同步的,消费和解码仍可能异步。
const url = URL.createObjectURL(blob);
preview.src = url;
download.href = url;
download.download = 'result.zip';
URL.revokeObjectURL(url);生命周期与清理
URL 保持登记时,浏览器需要让 Blob 可访问。反复替换预览却不释放旧 URL,会保留大型输出并增加内存。
不要在图片加载或下载消费前释放。应在替换旧结果、组件清理或目标操作开始后释放;已下载文件不受影响。
Blob URL 与 Data URL
Data URL 把内容直接放进字符串,通常使用 Base64;Blob URL 把字节留在浏览器管理区,只传短标记,避免 Base64 膨胀和巨型字符串。
Data URL 可移植,适合小型内嵌资源;Blob URL 限于会话,更适合大型临时预览和下载。
| 属性 | Blob URL | Data URL |
|---|---|---|
| 数据 | 浏览器管理 Blob | URL 字符串内部 |
| 开销 | 无 Base64 膨胀 | 通常 4/3 |
| 生命周期 | 释放/上下文结束前 | 字符串存在期间 |
| 可移植 | 否 | 是 |
| 场景 | 大型预览/下载 | 小型内嵌资源 |
安全与隐私
Blob URL 难猜但不是身份验证。得到适当上下文权限的代码可能访问它,敏感 URL 不应暴露给不受信任脚本。
创建 Blob URL 不会上传;把 Blob 交给 fetch 或 FormData 才会。隐私取决于完整代码路径。
常见错误
典型问题包括从不释放、过早释放、Blob 替换后保留旧 URL、把 URL 存数据库,或期待刷新后继续有效。
- 需要重新生成时保留 Blob。
- 替换结果时释放旧 URL。
- 只有分享需要时才使用持久服务器 URL。
- 大型预览避免 Base64。
总结
createObjectURL 不编码也不上传文件,只为已有 Blob 建立临时浏览器引用。用它完成预览和下载,并及时释放旧 URL。