1106 字
6 分钟
前端文件处理API

前端开发中的 Blob、File、FileReader 和 ArrayBuffer#

在现代前端开发中,处理文件和二进制数据是一个常见需求,例如上传图片、读取文件内容、与服务器进行二进制数据交互等。这些操作通常涉及 BlobFileFileReaderArrayBuffer。本文将详细介绍它们的定义、使用场景、优缺点,并通过实际代码演示它们的应用。


一、Blob (Binary Large Object)#

定义#

Blob 是一个表示不可变的、原始数据的类文件对象,可以包含文本和二进制数据。它常用于创建文件数据或处理二进制数据流。

使用场景#
  • 文件创建:生成临时文件以供下载或上传。
  • 数据存储:将二进制数据存储到内存中。
  • 数据传输:将二进制数据发送到服务器。
优缺点#
  • 优点:支持大规模二进制数据;与其他接口(如 FileURL.createObjectURL)无缝集成。
  • 缺点:一旦创建,内容不可变;操作受限于内存。
示例代码#
// 创建一个 Blob 对象
const blob = new Blob(["Hello, Blob!"], { type: "text/plain" });

// 创建一个下载链接
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'example.txt';
document.body.appendChild(a);
a.click();

// 清除 URL 对象
URL.revokeObjectURL(url);

二、File#

定义#

FileBlob 的子类,代表用户通过文件输入控件或其他方法生成的文件数据。与 Blob 不同,File 对象包含额外的文件元信息,如文件名和最后修改时间。

使用场景#
  • 文件上传:从用户输入中获取文件并上传到服务器。
  • 文件预览:展示用户选择的文件内容。
优缺点#
  • 优点:包含文件的元信息,便于处理用户生成的文件。
  • 缺点:必须通过用户输入控件或其他方式生成,无法直接创建。
示例代码#
// 监听文件输入
const input = document.createElement('input');
input.type = 'file';
input.addEventListener('change', (event) => {
    const file = event.target.files[0];
    console.log('File name:', file.name);
    console.log('File size:', file.size);
    console.log('File type:', file.type);
});
document.body.appendChild(input);

三、FileReader#

定义#

FileReader 是一个用于读取 BlobFile 内容的 API,可以以多种格式读取数据(如文本、Data URL 或 ArrayBuffer)。

使用场景#
  • 文件内容读取:用于显示文件内容(例如文本或图片)。
  • 预览文件:在文件上传前,将其内容加载并展示给用户。
优缺点#
  • 优点:支持异步读取,提供多种格式的读取方法。
  • 缺点:仅限于读取 BlobFile,读取大文件可能会消耗较多内存。
示例代码#
const input = document.createElement('input');
input.type = 'file';
input.addEventListener('change', (event) => {
    const file = event.target.files[0];
    const reader = new FileReader();

    reader.onload = (e) => {
        console.log('File content:', e.target.result);
    };

    reader.readAsText(file); // 读取文件为文本
});
document.body.appendChild(input);

四、ArrayBuffer#

定义#

ArrayBuffer 是一种表示通用、固定长度的二进制数据的对象,通常与视图(如 TypedArrayDataView)结合使用以操作其内容。

使用场景#
  • 处理二进制数据:如处理图片、音频、视频文件等。
  • 低级数据操作:操作字节级别的数据流。
  • 与 Web API 交互:如 WebSocket 或 Fetch API。
优缺点#
  • 优点:高效处理低级二进制数据;与 TypedArray 等工具集成。
  • 缺点:固定大小;需要额外工具进行操作。
示例代码#
// 创建一个 ArrayBuffer 并写入数据
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);

view.setInt8(0, 10); // 写入整数
view.setInt16(1, 1000, true); // 写入 16 位整数(小端序)

console.log(view.getInt8(0)); // 输出: 10
console.log(view.getInt16(1, true)); // 输出: 1000

五、实践应用示例#

文件上传与预览#

通过 FileFileReader 结合,实现文件的上传与预览功能。

const input = document.createElement('input');
input.type = 'file';

input.addEventListener('change', (event) => {
    const file = event.target.files[0];
    const reader = new FileReader();

    reader.onload = (e) => {
        const img = document.createElement('img');
        img.src = e.target.result;
        document.body.appendChild(img);
    };

    reader.readAsDataURL(file); // 将文件读取为 Data URL
});

document.body.appendChild(input);
文件下载#

结合 Blob 创建临时文件供用户下载。

const content = "This is a sample file.";
const blob = new Blob([content], { type: 'text/plain' });

const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'sample.txt';

document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href);

六、总结#

  • Blob 适用于创建和操作不可变的二进制数据。
  • File 是用户生成的文件,包含额外的元信息。
  • FileReader 提供了一种异步读取文件内容的方式。
  • ArrayBuffer 适合处理底层的二进制数据,特别是需要精确控制数据格式时。

掌握这些工具,可以帮助开发者高效地处理文件与二进制数据,在前端开发中如鱼得水!

前端文件处理API
https://huiguang.site/posts/frontend-file/
作者
冼慧光
发布于
2022-06-29
许可协议
CC BY-NC-SA 4.0