编程 File 和 Blob 的区别

2024-11-18 23:11:46 +0800 CST views 544

File 和 Blob 的区别

在前端开发中,FileBlob 是两个经常使用的对象,特别是在处理文件上传、下载、二进制数据等场景中。两者之间存在一些相似之处,但也有显著的区别。本文将详细解析这两个对象的不同点及其各自的应用场景。

1. Blob 对象

定义

Blob(Binary Large Object)是 JavaScript 中用于表示不可变的原始二进制数据的对象,可以存储文件、图片、音频、视频或纯文本等各种数据类型。Blob 提供了一种高效的方式来处理数据,而无需将其完全加载到内存中,尤其适合处理大文件。

创建方式

通过 new Blob() 构造函数可以创建一个 Blob 对象,语法如下:

const blob = new Blob(blobParts, options);
  • blobParts: 一个数组,可以包含字符串、ArrayBufferTypedArrayBlob 等类型的数据。
  • 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);
    
  • 上传文件: 通过 FormDataBlob 对象作为文件上传到服务器。

    const formData = new FormData();
    formData.append("file", blob, "example.txt");
    
    fetch("/upload", {
        method: "POST",
        body: formData,
    }).then(response => console.log("File uploaded successfully"));
    
  • 读取图片或其他文件: 通过 FileReaderBlob 读取为图片并显示。

    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
复制全文 生成海报 前端开发 JavaScript 数据处理

推荐文章

2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
底部导航栏
2024-11-19 01:12:32 +0800 CST
使用 node-ssh 实现自动化部署
2024-11-18 20:06:21 +0800 CST
PHP 如何输出带微秒的时间
2024-11-18 01:58:41 +0800 CST
Java环境中使用Elasticsearch
2024-11-18 22:46:32 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
全新 Nginx 在线管理平台
2024-11-19 04:18:33 +0800 CST
Vue3中如何进行性能优化?
2024-11-17 22:52:59 +0800 CST
15 个你应该了解的有用 CSS 属性
2024-11-18 15:24:50 +0800 CST
JavaScript 实现访问本地文件夹
2024-11-18 23:12:47 +0800 CST
一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
Linux查看系统配置常用命令
2024-11-17 18:20:42 +0800 CST
pip安装到指定目录上
2024-11-17 16:17:25 +0800 CST
mendeley2 一个Python管理文献的库
2024-11-19 02:56:20 +0800 CST
Gin 框架的中间件 代码压缩
2024-11-19 08:23:48 +0800 CST
前端代码规范 - 图片相关
2024-11-19 08:34:48 +0800 CST
JavaScript设计模式:发布订阅模式
2024-11-18 01:52:39 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
Go语言中实现RSA加密与解密
2024-11-18 01:49:30 +0800 CST
使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
Vue 中如何处理父子组件通信?
2024-11-17 04:35:13 +0800 CST
Node.js中接入微信支付
2024-11-19 06:28:31 +0800 CST
git使用笔记
2024-11-18 18:17:44 +0800 CST
如何使用go-redis库与Redis数据库
2024-11-17 04:52:02 +0800 CST
程序员茄子在线接单