关于Blob的URL
关于Blob的URL
当你在浏览器网络请求中看到 blob:https://...
这样的请求头或 URL 时,它表示该请求涉及 Blob 对象(二进制大对象),通常用于前端动态生成或处理的资源(如视频、图片、文件片段)。以下是详细解析:
1. blob:https:
是什么?
- Blob URL:
浏览器通过URL.createObjectURL()
为 Blob 或 File 对象 生成的临时虚拟 URL,格式为blob:<origin>/<uuid>
。
例如:1
blob:https://example.com/550e8400-e29b-41d4-a716-446655440000
https://example.com
:当前页面的源(Origin),确保同源策略安全限制。uuid
:唯一标识符,指向内存或临时存储中的 Blob 数据。
2. 常见场景
(1)媒体播放(视频/音频)
- 动态加载媒体片段:
通过fetch
或XMLHttpRequest
获取视频分片(如 HLS 的.ts
文件),转换为 Blob 后生成 URL 供<video>
播放:1 2 3 4
fetch('video.ts').then(response => response.blob()).then(blob => { const blobUrl = URL.createObjectURL(blob); videoElement.src = blobUrl; // 直接播放 Blob });
(2)文件下载/预览
- 前端生成文件:
将数据(如 CSV、PDF)转为 Blob,生成链接供用户下载:1 2 3 4 5 6
const blob = new Blob(['Hello, World!'], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'file.txt'; a.click(); // 触发下载
(3)Canvas/图像处理
- 截图或绘图导出:
Canvas 转换为 Blob 后生成 URL:1 2 3 4
canvas.toBlob(blob => { const imgUrl = URL.createObjectURL(blob); imgElement.src = imgUrl; // 显示处理后的图像 });
3. 请求头中的 blob:https:
- 现象:
在浏览器开发者工具的 Network 面板中,可能会看到请求的 URL 或Referer
头包含blob:https:
。
- 原因:
请求是从一个 Blob URL 发起的(例如通过fetch(blobUrl)
或<script src="blob:...">
)。
4. 关键特性
特性 | 说明 |
---|---|
临时性 | Blob URL 仅在当前文档生命周期内有效,页面刷新或关闭后失效。 |
同源限制 | 仅允许同源页面访问(blob:https://example.com/... 只能由 example.com 使用)。 |
内存管理 | 需手动释放:URL.revokeObjectURL(blobUrl) ,避免内存泄漏。 |
无实际存储 | Blob 数据存在内存中,不占用服务器存储。 |
5. 与普通 URL 的区别
对比项 | Blob URL | 普通 HTTP/HTTPS URL |
---|---|---|
生成方式 | 前端动态生成 (createObjectURL ) | 服务器提供 |
内容来源 | 本地 Blob/File 对象 | 服务器文件 |
生命周期 | 随页面销毁或手动释放 | 持久存在 |
性能 | 快速(无网络请求) | 依赖网络延迟 |
6. 安全注意事项
- 不可跨域:
blob:https://a.com
的资源无法被https://b.com
的页面访问。 - 敏感数据风险:
若 Blob 包含用户隐私数据(如上传的文件),需及时调用revokeObjectURL()
清理。 - XSS 防御:
避免直接将用户输入的 Blob 插入 DOM(可能执行恶意脚本)。
7. 示例代码分析
1
2
3
4
5
6
7
8
9
10
11
12
13
// 1. 创建 Blob
const blob = new Blob(['{"data": "test"}'], { type: 'application/json' });
// 2. 生成 Blob URL
const blobUrl = URL.createObjectURL(blob);
// 3. 发起请求(Network 面板会显示 blob:https:...)
fetch(blobUrl)
.then(res => res.json())
.then(data => console.log(data)); // 输出: {data: "test"}
// 4. 释放内存
URL.revokeObjectURL(blobUrl);
总结
blob:https:
是浏览器为 本地 Blob 数据 生成的临时 URL,用于前端高效处理二进制资源(如媒体、文件)。它在网络请求中出现时,表明资源来自客户端动态生成而非服务器,需注意其临时性和同源安全限制。
本文由作者按照 CC BY 4.0 进行授权