文章

关于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)媒体播放(视频/音频)

  • 动态加载媒体片段
    通过 fetchXMLHttpRequest 获取视频分片(如 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 进行授权