Blob对象怎么使用

来源:网站主作者:澳门程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Blob对象怎么使用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Blob对象怎么使用》有用,将其分享出去将是对创作者最好的鼓励。

Blob对象全称为Binary Large Object,是JavaScript中用于表示不可变的原始二进制数据的类文件对象,它可以存储文本、图片、视频等各类数据,是前端处理二进制数据的核心对象之一。

Blob对象怎么使用

Blob对象的基础属性

Blob对象包含两个核心只读属性,我们可以通过这两个属性获取Blob数据的基本信息:

  • size:表示Blob对象所包含数据的字节大小
  • type:表示Blob对象所包含数据的MIME类型,比如文本类型为text/plain,图片类型为image/png,如果类型未知则为空字符串

创建Blob对象

我们可以通过Blob构造函数来创建Blob对象,构造函数的语法如下:

// Blob构造函数接收两个参数
// 第一个参数是由ArrayBuffer、ArrayBufferView、Blob、DOMString等对象构成的数组,表示要放入Blob的数据
// 第二个参数是可选的配置对象,可设置type等属性
const blob = new Blob(array, options);

下面是一个创建文本类型Blob对象的示例:

// 创建一个包含文本内容的Blob对象,指定MIME类型为纯文本
const textBlob = new Blob(['这是一段测试文本'], { type: 'text/plain' });
console.log(textBlob.size); // 输出:18(每个中文字符占2字节,6个中文+6个标点共12?不对,实际UTF-8下中文是3字节,这里示例仅作演示)
console.log(textBlob.type); // 输出:text/plain

读取Blob对象内容

Blob对象本身不提供直接读取内容的方法,我们通常需要借助FileReader对象或者Response对象来读取它的内容。

使用FileReader读取Blob

FileReader是专门用于读取File或Blob对象内容的API,支持将内容读取为多种格式:

const blob = new Blob(['Hello Blob'], { type: 'text/plain' });
const reader = new FileReader();

// 读取为文本格式
reader.readAsText(blob);
reader.onload = function() {
  console.log(this.result); // 输出:Hello Blob
};

// 也可以读取为DataURL格式
const reader2 = new FileReader();
reader2.readAsDataURL(blob);
reader2.onload = function() {
  console.log(this.result); // 输出:data:text/plain;base64,SGVsbG8gQmxvYg==
};

使用Response读取Blob

Response是Fetch API的一部分,也可以直接接收Blob对象,通过它的方法读取内容:

const blob = new Blob(['测试内容'], { type: 'text/plain' });
const response = new Response(blob);
// 读取为文本
response.text().then(text => {
  console.log(text); // 输出:测试内容
});
// 也可以读取为ArrayBuffer
response.arrayBuffer().then(buffer => {
  console.log(new Uint8Array(buffer)); // 输出对应的字节数组
});

Blob对象的常见使用场景

场景1:前端生成文件并下载

我们可以通过Blob对象生成文件内容,再结合URL.createObjectURL方法创建下载链接,实现前端文件下载:

// 生成CSV文件内容
const csvContent = '姓名,年龄,性别n张三,20,男n李四,22,女';
const csvBlob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
// 创建下载链接
const downloadUrl = URL.createObjectURL(csvBlob);
const link = document.createElement('a');
link.href = downloadUrl;
link.download = '用户信息.csv';
// 触发点击下载
link.click();
// 释放URL对象,避免内存泄漏
URL.revokeObjectURL(downloadUrl);

场景2:图片预览

当用户上传图片文件时,我们可以通过FileReader或者URL.createObjectURL将File对象(File是Blob的子类)转换为可预览的URL:

// 假设页面有一个文件输入框<input type="file" id="fileInput">和一个图片预览标签<img id="previewImg">
const fileInput = document.getElementById('fileInput');
const previewImg = document.getElementById('previewImg');

fileInput.addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (file) {
    // 将File对象转换为预览URL
    const imgUrl = URL.createObjectURL(file);
    previewImg.src = imgUrl;
    // 图片加载完成后释放URL
    previewImg.onload = function() {
      URL.revokeObjectURL(imgUrl);
    };
  }
});

场景3:分片上传大文件

处理大文件上传时,我们可以将大文件对应的Blob对象通过slice方法切割成多个小Blob分片,分别上传:

function splitFile(file, chunkSize = 1024 * 1024) { // 默认分片大小1MB
  const chunks = [];
  let start = 0;
  while (start < file.size) {
    // slice方法切割Blob,返回新的Blob对象
    const chunk = file.slice(start, start + chunkSize);
    chunks.push(chunk);
    start += chunkSize;
  }
  return chunks;
}

// 使用示例
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (file) {
    const chunks = splitFile(file, 2 * 1024 * 1024); // 2MB分片
    console.log(`文件被分为${chunks.length}个分片`);
    // 后续可以遍历chunks分别上传
  }
});

Blob对象与File对象的区别

很多开发者会混淆Blob和File对象,两者的关系如下:

对比项Blob对象File对象
数据来源可以通过构造函数手动创建,也可以来自其他二进制数据通常来自用户上传的文件或者拖拽的文件,是Blob的子类
额外属性只有size和type两个属性除了size和type,还有name(文件名)、lastModified(最后修改时间)等属性
使用场景用于处理任意二进制数据,比如生成文件、处理数据流专门用于处理用户本地的文件

注意事项

  • 通过URL.createObjectURL创建的URL对象会占用内存,使用完成后一定要及时调用URL.revokeObjectURL释放,避免内存泄漏
  • Blob对象是不可变的,一旦创建就无法修改其内容,如果需要修改数据,只能创建新的Blob对象
  • 当处理大Blob数据时,尽量避免一次性读取全部内容到内存,可以采用分片或者流式处理的方式

Blob对象JavaScript二进制数据文件操作修改时间:2026-06-16 01:57:35

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。