编程 `Blob` 与 `File` 的关系

2025-05-11 23:45:58 +0800 CST views 242

在前端开发中,掌握 BlobFile 对象的使用至关重要,它们是处理文件上传、下载、预览等操作的核心工具。以下是对这两个对象的深入解析及其在实际开发中的应用示例。


📦 BlobFile 的关系

  • Blob(Binary Large Object):表示不可变的原始数据,通常用于处理二进制数据,如图像、音频等。
  • File:继承自 Blob,并添加了文件名(name)和最后修改时间(lastModified)等属性,专门用于表示用户系统上的文件。([知乎专栏][1], [开源中国][2])

简而言之,File 是一个带有元数据的 Blob,更适合用于文件上传等场景。


🔧 常见操作示例

1. 实时预览用户上传的头像

通过 FileReader 将用户上传的图片文件读取为 Data URL,实现即时预览:([掘金][3])

<input type="file" id="avatar" accept="image/*">
<img id="preview" alt="头像预览">
document.getElementById('avatar').addEventListener('change', function(e) {
  const file = e.target.files[0];
  const reader = new FileReader();
  reader.onload = function(event) {
    document.getElementById('preview').src = event.target.result;
  };
  reader.readAsDataURL(file);
});

2. 大文件分片上传

使用 Blob.prototype.slice 方法将大文件分割成小块,逐个上传,支持断点续传:([javascript.ruanyifeng.com][4])

function uploadFileInChunks(file) {
  const CHUNK_SIZE = 1024 * 1024; // 1MB
  let start = 0;

  while (start < file.size) {
    const end = Math.min(start + CHUNK_SIZE, file.size);
    const chunk = file.slice(start, end);
    // 发送 chunk 到服务器
    start = end;
  }
}

3. 浏览器端生成并下载文件

创建一个 Blob 对象,并通过 URL.createObjectURL 生成下载链接:

const content = 'Hello, world!';
const blob = new Blob([content], { type: 'text/plain' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'hello.txt';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);

4. 图片压缩处理

利用 canvas 对上传的图片进行压缩,减少文件大小:

function compressImage(file, quality = 0.8) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = function(event) {
      const img = new Image();
      img.onload = function() {
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        canvas.getContext('2d').drawImage(img, 0, 0);
        canvas.toBlob(resolve, 'image/jpeg', quality);
      };
      img.src = event.target.result;
    };
    reader.readAsDataURL(file);
  });
}

5. 文件与二进制数据的互相转换

  • File → ArrayBuffer:
  file.arrayBuffer().then(buffer => {
    // 处理 ArrayBuffer 数据
  });
  • Blob → Base64:
  const reader = new FileReader();
  reader.onload = function(event) {
    const base64 = event.target.result;
    // 使用 base64 数据
  };
  reader.readAsDataURL(blob);
  • Base64 → Blob:
  fetch(base64Data)
    .then(res => res.blob())
    .then(blob => {
      // 使用 blob 数据
    });

⚠️ 注意事项

  • 内存管理:使用 URL.createObjectURL 创建的 URL 在不再需要时应调用 URL.revokeObjectURL 释放资源。
  • 文件类型验证:不要完全依赖 file.type,应读取文件内容进行验证,以防止伪造。
  • 大文件处理:对于大文件,优先使用 stream() 方法处理,避免内存占用过高。
  • 浏览器兼容性:某些浏览器(如 Safari)对 Blob 的支持可能存在差异,需进行兼容性测试。([MDN Web Docs][5])

通过熟练掌握 BlobFile 的使用,可以大大提升前端在文件处理方面的能力,实现更丰富的功能和更好的用户体验。

复制全文 生成海报 前端开发 文件处理 Web技术

推荐文章

网站日志分析脚本
2024-11-19 03:48:35 +0800 CST
linux设置开机自启动
2024-11-17 05:09:12 +0800 CST
html5在客户端存储数据
2024-11-17 05:02:17 +0800 CST
利用Python构建语音助手
2024-11-19 04:24:50 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
Vue3中如何处理状态管理?
2024-11-17 07:13:45 +0800 CST
OpenCV 检测与跟踪移动物体
2024-11-18 15:27:01 +0800 CST
Golang 几种使用 Channel 的错误姿势
2024-11-19 01:42:18 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
Vue3中的Scoped Slots有什么改变?
2024-11-17 13:50:01 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
实现微信回调多域名的方法
2024-11-18 09:45:18 +0800 CST
IP地址获取函数
2024-11-19 00:03:29 +0800 CST
Vue3的虚拟DOM是如何提高性能的?
2024-11-18 22:12:20 +0800 CST
如何在Vue 3中使用Ref访问DOM元素
2024-11-17 04:22:38 +0800 CST
Vue3 vue-office 插件实现 Word 预览
2024-11-19 02:19:34 +0800 CST
mysql删除重复数据
2024-11-19 03:19:52 +0800 CST
程序员茄子在线接单