当然可以,以下是一篇全面讲解 Blob 文件格式 的前端必备技能文章,适合作为技术博文、学习笔记或培训资料:
🧩 一文了解 Blob 文件格式:前端必备技能之一
在前端开发中,Blob
(Binary Large Object)是处理二进制数据的核心接口之一,是与文件处理、图片上传、音视频流、Web API 对接等密切相关的重要工具。本文将全面解析 Blob
的原理、用法与实战案例,助你掌握前端数据处理的核心技能。
📌 目录
- 什么是 Blob?
- Blob 和 File 有何区别?
- 如何创建 Blob?
- Blob 常见用途与实战技巧
- Blob 与 URL.createObjectURL()
- Blob 转换为 File、Base64 等
- 注意事项与浏览器兼容性
- 小结与推荐实践
1️⃣ 什么是 Blob?
Blob
是 Binary Large Object 的缩写,用于表示不可变的原始二进制数据文件。你可以把它看作浏览器中表示“原始文件数据”的一个轻量对象。
在 JavaScript 中,Blob 可用于:
- 创建临时文件对象
- 图片、音频、视频的上传与处理
- 从 canvas 导出图像
- 数据流的拼接和传输
2️⃣ Blob vs File:有什么区别?
特性 | Blob | File |
---|---|---|
来源 | 自定义数据 | 用户上传或浏览器系统生成 |
有文件名 | ❌ 无 | ✅ 有 |
最常用场景 | 二进制拼接、传输 | 表单上传 |
继承关系 | – | 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) |
发表回复