一文了解Blob文件格式,前端必备技能之一

article/2025/8/23 16:05:23

文章目录

  • 前言
  • 一、什么是Blob?
  • 二、Blob的基本特性
  • 三、Blob的构造函数
  • 四、常见使用场景
    • 1. 文件下载
    • 2. 图片预览
    • 3. 大文件分片上传
  • 四、Blob与其他API的关系
    • 1. File API
    • 2. FileReader
    • 3. URL.createObjectURL()
    • 4. Response
  • 五、性能与内存管理
  • 六、实际案例:导出Word文档
  • 七、浏览器兼容性
  • 八、总结


在这里插入图片描述

前言

最近在项目中需要导出文档时,我首次接触到了 Blob 文件格式。作为一个前端开发者,虽然经常听到 "Blob" 这个术语,但对其具体原理和应用场景并不十分了解。经过一番研究和实践,我决定将所学整理成文,与大家分享 Blob 技术的奥秘。

一、什么是Blob?

Blob(Binary Large Object,二进制大对象)是 JavaScript 中用于表示二进制数据的一个对象。它本质上是一个不可变的、原始数据的类文件对象,可以存储大量的二进制数据。

// 创建一个简单的Blob对象
const blob = new Blob(["Hello, world!"], { type: 'text/plain' });

二、Blob的基本特性

  • 不可变性:一旦创建,Blob 对象的内容无法直接修改
  • 类型标识:通过 MIME 类型标识数据格式
  • 大小存储:可以存储大量二进制数据
  • 分片能力:可以被分割成更小的 Blob 对象

三、Blob的构造函数

Blob构造函数接受两个参数:

new Blob(blobParts, options);
  • blobParts:由ArrayBuffer、ArrayBufferView、Blob、DOMString等对象构成的数组
  • options:可选参数,包含两个属性:
    • type:Blob内容的MIME类型
    • endings:指定包含行结束符\n的字符串如何写入

四、常见使用场景

1. 文件下载

function downloadFile(content, filename, type) {const blob = new Blob([content], { type });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename;a.click();URL.revokeObjectURL(url);
}// 使用示例
downloadFile('Hello, world!', 'example.txt', 'text/plain');

2. 图片预览

function previewImage(file) {const blob = URL.createObjectURL(file);const img = document.createElement('img');img.onload = function() {URL.revokeObjectURL(this.src); // 释放内存};img.src = blob;document.body.appendChild(img);
}// 使用示例
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {previewImage(e.target.files[0]);
});

3. 大文件分片上传

function uploadLargeFile(file, chunkSize = 1024 * 1024) {let offset = 0;const fileSize = file.size;while (offset < fileSize) {const chunk = file.slice(offset, offset + chunkSize);// 上传chunk...offset += chunkSize;}
}

四、Blob与其他API的关系

1. File API

File 对象继承自 Blob ,在Blob基础上增加了文件名、最后修改时间等元数据。

2. FileReader

用于读取 BlobFile 对象的内容:

const reader = new FileReader();
reader.onload = function(e) {console.log(e.target.result);
};
reader.readAsText(blob);

3. URL.createObjectURL()

创建指向 Blob 对象的 URL ,可用于预览或下载。

4. Response

Fetch APIResponse 对象可以将 Blob 作为响应体:

fetch(url).then(response => response.blob()).then(blob => {// 处理blob});

五、性能与内存管理

使用Blob时需要注意:

  1. 内存释放:通过 URL.revokeObjectURL() 及时释放不再需要的Blob URL
  2. 大文件处理:对于大文件,考虑使用 slice() 方法分块处理
  3. Worker线程:处理大型 Blob 时可在 Web Worker 中进行以避免阻塞主线程

六、实际案例:导出Word文档

最近我在项目中需要将 HTML 内容导出为 Word 文档,使用 Blob 技术可以轻松实现:

function exportAsWord(html, filename = 'document.doc') {// Word文档的HTML模板const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><title>Document</title></head><body>${html}</body></html>`;// 创建Blob对象const blob = new Blob([template], {type: 'application/msword'});// 创建下载链接const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename;document.body.appendChild(a);a.click();// 清理document.body.removeChild(a);URL.revokeObjectURL(url);
}

七、浏览器兼容性

大多数现代浏览器都支持Blob API,包括:

  • Chrome 20+
  • Firefox 13+
  • Safari 6+
  • Edge 12+
  • Opera 15+

对于IE10及以下版本,需要使用替代方案如 msSaveBlobFileSaver.js 等polyfill。

八、总结

Blob 作为 Web 开发中处理二进制数据的重要工具,在文件操作、多媒体处理、数据存储等场景中发挥着关键作用。通过本文的介绍,相信大家对 Blob 技术有了更深入的理解。在实际开发中,合理使用 Blob 可以大大提升应用的性能和用户体验。


http://www.hkcw.cn/article/CZsEksmsWg.shtml

相关文章

双剑破天门:攻防世界Web题解之独孤九剑心法(十)

免责声明&#xff1a;用户因使用公众号内容而产生的任何行为和后果&#xff0c;由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任 **本文以攻防世界部分题为例进行演示&#xff0c;后续会对攻防世界大部分的web题目进行演示&#xff0c;如果你感兴趣请…

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介 Android WebView 是一种视图组件&#xff0c;使得 And…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台,后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码,这就是若依的强大之处,即便你不会Java和vue开发,只要跟着石头哥也可以快速的开发一款Java和vue程序。 技术点 …

OpenWebUI如何对外提供HTTP接口?

from 公众号&#xff1a;程序员more OpenWebUI通过HTTP方式提供对外接口&#xff0c;使得开发者可以通过HTTP方式快速对接拥有RAG能力的模型基座。 01 OpenWebUI配置app key OpenWebUI使用BearerToken机制对 API 请求进行身份验证。从 Open WebUI 中的“设置>帐户”获取 …

中使馆回应美将撤销中国留学生签证 坚决反对歧视做法

中使馆回应美将撤销中国留学生签证 坚决反对歧视做法!中国驻美国大使馆发言人于5月29日针对美国务院发表的声明作出回应,该声明称将撤销有关中国在美留学生的签证。发言人表示,中方坚决反对美方这一政治性、歧视性的做法。这种行为将严重损害中国在美留学人员的正当合法权益…

【Markdown基础语法】

Markdown语法 顶部 一、标题#~###### 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二、粗体 **粗体** 粗体字 三、斜体** 斜体字 四、删除字~~~~ 删除文字​ 五、分割线***、—、___ 六、无序列表-、、* 1 2 3 七、有序列表数字后加点1. 第一项第二项 …

ROS云课基础篇-03-apt趣味小应用-250529

基本看完01和02&#xff0c;还想继续&#xff0c;十分魔幻&#xff0c;来点有趣好玩的吧。 ROS云课基础篇-01-Linux-250529-CSDN博客 ROS云课基础篇-02-C-250529-CSDN博客 在Ubuntu中&#xff0c;有许多有趣且实用的小应用可以为系统增添乐趣和功能性。以下是一些类似xeyes和…

上海老电梯更新费用规定 公积金可提取支付

上海老电梯更新费用规定 公积金可提取支付。为支持职工筹集住宅老旧电梯更新费用,改善居住条件,上海市住房公积金管委会近日印发《关于上海市住房公积金支持老旧电梯更新有关政策的通知》,将于2025年7月1日起施行。根据通知规定,住宅老旧电梯更新项目经业主依法表决通过,小…

网络编程之网络编程预备知识

网络编程预备知识 1. 网络编程 1.1 网络通信 通信/通讯需要具备两个基本条件&#xff1a; 物理媒介&#xff08;物理层面&#xff09; 网线&#xff0c;光纤 协议&#xff08;软件层面&#xff09;网络通信协议 1.2 网络协议层次模型 层次&#xff1a;把不同的功能封装成…

Spring Boot+Activiti7入坑指南初阶版

介绍  Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spri…

信创改造选择C86,相比于ARM架构有什么优势?

随着信息技术应用创新&#xff08;信创&#xff09;产业的快速发展&#xff0c;信创改造已成为我国信息技术产业升级的重要方向。信创改造的核心目标是实现信息技术的自主可控&#xff0c;保障国家信息安全&#xff0c;同时推动国产软硬件在各行业的广泛应用。 2025年作为信创产…

20250529-C#知识:运算符重载

C#知识&#xff1a;运算符重载 运算符重载能够让我们像值类型数据那样使用运算符对类或结构体进行运算&#xff0c;并且能够自定义运算逻辑。 1、运算符重载及完整代码示例 作用是让自定义的类或者结构体能够使用运算符运算符重载一定是public static的可以把运算符看成一个函…

【AI面试秘籍】| 第24期:Transformers / LLM的词表应该选多大?

在构建和训练Transformers以及大型语言模型 (LLM) 时&#xff0c;词表 (Vocabulary) 大小的选择是一个至关重要且常常令人困惑的问题。它不仅直接影响模型的性能&#xff0c;还关系到模型的计算效率和内存占用。那么&#xff0c;当面试官抛出这个问题时&#xff0c;我们应该如何…

一文清晰理解目标检测指标计算

一、核心概念 1.交并比IoU 预测边界框与真实边界框区域的重叠比&#xff0c;取值范围为[0,1] 设预测边界框为&#xff0c;真实边界框为 公式&#xff1a; IoU计算为两个边界框交集面积与并集面积之比&#xff0c;图示如下 IoU值越高&#xff0c;表示预测边界框与真实边界框的对…

一文讲懂fork函数(c语言linux)

c语言的fork函数是拿来创建子进程的, 进程 pcb(process control block) 代码和数据 子进程中的代码和数据与父进程的一致(共享父进程的代码和数据),没有自己的代码和数据. 如果父进程或者子进程要修改数据,操作系统就会把要修改的数据拷贝一份新的,让目标进程修改这份拷贝…

LVDS系列14:Xilinx Ultrascale系可编程输入延迟(四)

本节讲解Ultrascale IDELAYE3的TIME模式仿真&#xff1b;  TIME模式下参数和时序&#xff1a; 必须例化IDELAYCTRL&#xff0c;IDELAYCTRL时钟频率与REFCLK_FREQUEMCY参数相同&#xff1b; 有温度电压补偿&#xff0c;EN_VTC在修改抽头值时拉低&#xff0c;修改完毕后拉高&a…

RTX腾讯通停服后,有哪些兼容Linux及移动端的升级途径?

一、RTX腾讯通停服后的核心挑战 1.国产系统与移动端适配中断 RTX腾讯通停更后无法适配统信UOS、银河麒麟等国产操作系统&#xff0c;原有Windows版本在Linux内核环境下运行异常&#xff0c;且缺乏Android、iOS移动端支持&#xff0c;阻碍跨平台协作。 2.大规模组织架构同步失…

美团启动618大促,线上消费节被即时零售传导到线下了?

首先&#xff0c;从市场推广与消费者吸引的角度来看&#xff0c;美团通过联合众多品牌开展大规模促销活动&#xff0c;并发放高额优惠券包&#xff0c;旨在吸引更多消费者参与购物。这种策略有助于提高平台的活跃度和交易量&#xff0c;同时也能够增强用户粘性。对于消费者而言…

TDengine 运维——巡检工具(安装前预配置)

背景 TDengine 的安装部署对环境系统有一定的依赖和要求&#xff0c;安装部署前需要进行环境预配置操作&#xff0c;本文档旨在说明安装前预配置工具在安装 TDengine 前对环境的预配置内容和工具的使用方法。 预配置工具使用方法 工具支持通过 help 参数查看支持的语法 Usa…

收集飞花令碎片——C语言(数组+函数)

C语言的函数&#xff08;Function&#xff09;是程序的基本构建块&#xff0c;用于封装一段可重用的代码&#xff0c;完成特定任务。函数可以提高代码的模块化、可读性和复用性。 目录 函数库函数标准库头文件自定义函数&#xff08;1&#xff09;基本语法&#xff08;2&#x…