File 和 Blob 的区别
在前端开发中,File
和 Blob
是两个经常使用的对象,特别是在处理文件上传、下载、二进制数据等场景中。两者之间存在一些相似之处,但也有显著的区别。本文将详细解析这两个对象的不同点及其各自的应用场景。
1. Blob 对象
定义
Blob
(Binary Large Object)是 JavaScript 中用于表示不可变的原始二进制数据的对象,可以存储文件、图片、音频、视频或纯文本等各种数据类型。Blob
提供了一种高效的方式来处理数据,而无需将其完全加载到内存中,尤其适合处理大文件。
创建方式
通过 new Blob()
构造函数可以创建一个 Blob
对象,语法如下:
const blob = new Blob(blobParts, options);
blobParts
: 一个数组,可以包含字符串、ArrayBuffer
、TypedArray
、Blob
等类型的数据。options
: 可选项,包含type
(MIME 类型)和endings
(换行符)。
例如:
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
Blob 的属性和方法
size: 返回
Blob
对象的大小(以字节为单位)。console.log(blob.size); // 输出 Blob 的大小
type: 返回
Blob
对象的 MIME 类型。console.log(blob.type); // 输出 Blob 的 MIME 类型
常用方法
slice([start], [end], [contentType]): 从
Blob
中提取一部分数据,返回一个新的Blob
对象。const partialBlob = blob.slice(0, 5);
text(): 将
Blob
的内容读取为文本字符串,返回一个Promise
,解析为文本数据。blob.text().then(text => console.log(text)); // 输出 "Hello, world!"
arrayBuffer(): 将
Blob
的内容读取为ArrayBuffer
,适合处理二进制数据,返回一个Promise
。blob.arrayBuffer().then(buffer => console.log(buffer));
stream(): 返回
Blob
数据的ReadableStream
,用于流式处理大文件。const stream = blob.stream();
使用场景
生成文件下载: 通过
Blob
创建文件并生成下载链接供用户下载。const blob = new Blob(["This is a test file."], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "test.txt"; a.click(); URL.revokeObjectURL(url);
上传文件: 通过
FormData
将Blob
对象作为文件上传到服务器。const formData = new FormData(); formData.append("file", blob, "example.txt"); fetch("/upload", { method: "POST", body: formData, }).then(response => console.log("File uploaded successfully"));
读取图片或其他文件: 通过
FileReader
将Blob
读取为图片并显示。const reader = new FileReader(); reader.onload = function(e) { const img = document.createElement("img"); img.src = e.target.result; document.body.appendChild(img); }; reader.readAsDataURL(blob);
2. File 对象
定义
File
是 JavaScript 中代表文件的数据结构,它继承自 Blob
,并包含了文件的元数据(如文件名、类型、大小、最后修改时间等)。File
对象通常由用户通过 <input type="file">
元素选择文件时创建,但也可以通过 JavaScript 手动创建。
创建方式
用户通过文件选择创建 File
对象:
<input type="file" id="fileInput" />
<script>
document.getElementById("fileInput").addEventListener("change", (event) => {
const file = event.target.files[0];
console.log("文件名:", file.name);
console.log("文件类型:", file.type);
console.log("文件大小:", file.size);
});
</script>
手动创建 File
对象:
const file = new File(["Hello, world!"], "hello-world.txt", { type: "text/plain" });
console.log(file);
File 的属性和方法
File
继承了 Blob
的所有属性和方法,因此它具有所有 Blob
的功能。此外,File
还具有以下属性:
- name: 文件名。
- lastModified: 文件的最后修改时间(以毫秒为单位)。
例如:
console.log(file.name); // 输出文件名
console.log(file.lastModified); // 输出最后修改时间
常用方法
slice(): 从文件中获取一部分数据,返回一个新的
Blob
对象。const blob = file.slice(0, 1024); // 获取文件的前 1024 个字节
text(): 读取文件内容,作为文本返回。
file.text().then(text => console.log(text));
arrayBuffer(): 将文件内容读取为
ArrayBuffer
。file.arrayBuffer().then(buffer => console.log(buffer));
stream(): 返回
ReadableStream
,可用于流式处理文件数据。const stream = file.stream();
3. 总结
- Blob 是纯粹的二进制数据,适用于处理各种类型的二进制数据,但不包含文件元数据。
- File 继承自
Blob
,并包含了文件的元数据(文件名、最后修改时间等)。File
对象更专注于与文件系统的交互。
可以将 File
看作是包含文件信息的 Blob
。两者在处理二进制数据时经常结合使用,Blob
通常用于通用的数据处理,而 File
适用于文件上传等操作。
const file = new File(["Hello, world!"], "hello.txt", { type: "text/plain" });
console.log(file instanceof Blob); // true