当然可以,以下是一篇全面讲解 Blob 文件格式 的前端必备技能文章,适合作为技术博文、学习笔记或培训资料:


🧩 一文了解 Blob 文件格式:前端必备技能之一

在前端开发中,Blob(Binary Large Object)是处理二进制数据的核心接口之一,是与文件处理、图片上传、音视频流、Web API 对接等密切相关的重要工具。本文将全面解析 Blob 的原理、用法与实战案例,助你掌握前端数据处理的核心技能。


📌 目录

  1. 什么是 Blob?
  2. Blob 和 File 有何区别?
  3. 如何创建 Blob?
  4. Blob 常见用途与实战技巧
  5. Blob 与 URL.createObjectURL()
  6. Blob 转换为 File、Base64 等
  7. 注意事项与浏览器兼容性
  8. 小结与推荐实践

1️⃣ 什么是 Blob?

Blob 是 Binary Large Object 的缩写,用于表示不可变的原始二进制数据文件。你可以把它看作浏览器中表示“原始文件数据”的一个轻量对象。

在 JavaScript 中,Blob 可用于:

  • 创建临时文件对象
  • 图片、音频、视频的上传与处理
  • 从 canvas 导出图像
  • 数据流的拼接和传输

2️⃣ Blob vs File:有什么区别?

特性BlobFile
来源自定义数据用户上传或浏览器系统生成
有文件名❌ 无✅ 有
最常用场景二进制拼接、传输表单上传
继承关系File 继承自 Blob
console.log(new File(["hello"], "test.txt") instanceof Blob); // true

3️⃣ 如何创建 Blob?

const blob = new Blob(["Hello Blob!"], { type: "text/plain" });
console.log(blob.size); // 11
console.log(blob.type); // text/plain

支持的数据类型:

  • string
  • ArrayBuffer / TypedArray / DataView
  • Blob
  • 以上混合组成的数组
const buffer = new ArrayBuffer(8);
const blob = new Blob(["prefix-", buffer], { type: "application/octet-stream" });

4️⃣ Blob 常见用途与实战技巧

✅ 下载文件(模拟下载链接)

const blob = new Blob(["Download me!"], { type: "text/plain" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "example.txt";
a.click();
URL.revokeObjectURL(url);

✅ 上传文件(用于接口 FormData)

const blob = new Blob(["Upload this!"], { type: "text/plain" });
const formData = new FormData();
formData.append("file", blob, "upload.txt");

fetch("/api/upload", {
  method: "POST",
  body: formData,
});

✅ canvas 导出图片

const canvas = document.querySelector("canvas");
canvas.toBlob((blob) => {
  const url = URL.createObjectURL(blob);
  // 显示或下载图片
});

5️⃣ Blob 与 URL.createObjectURL()

URL.createObjectURL(blob) 会为该 Blob 创建一个短期有效的内存 URL,可用于:

  • <img src=""> 显示图片
  • <video src=""> 播放视频流
  • <a download> 触发下载

⚠️ 记得手动 URL.revokeObjectURL(url) 释放内存资源!


6️⃣ Blob 的互转技巧

✅ Blob → File

const file = new File([blob], "file.txt", { type: blob.type });

✅ Blob → Base64

function blobToBase64(blob) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result);
    reader.readAsDataURL(blob);
  });
}

✅ Base64 → Blob

function base64ToBlob(base64) {
  const [prefix, data] = base64.split(',');
  const mime = prefix.match(/:(.*?);/)[1];
  const binary = atob(data);
  const array = new Uint8Array(binary.length);
  for (let i = 0; i < binary.length; i++) array[i] = binary.charCodeAt(i);
  return new Blob([array], { type: mime });
}

7️⃣ 注意事项与兼容性

  • Blob 在所有现代浏览器中都已支持
  • FileReader.readAsArrayBuffer 可与 Blob 协同处理大文件流
  • URL Blob 对象的内存不能自动释放,需手动释放
  • 大文件分片上传可用 Blob.slice() 进行断点续传等处理

✅ 小结与推荐实践

应用场景推荐用法
文件下载Blob + URL.createObjectURL + <a>
表单文件上传FormData.append(blob, name)
canvas / 视频 / 图片处理canvas.toBlob、MediaRecorder生成Blob
文件预览FileReader 或 URL.createObjectURL
转 Base64 传输FileReader.readAsDataURL(blob)

📚 延伸阅读