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

文章目录

  • 前言
  • 一、什么是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.pswp.cn/news/909834.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLMs 系列实操科普(4)

六、deep research 这是 chatgpt 推出的功能&#xff0c;但我这里是免费用户&#xff0c;一个月才有 5 次使用机会&#xff0c;而且使用的是轻量化模型版本&#xff0c;相对体验上比较鸡肋一些。 那这个深度思考研究是个什么东西呢&#xff1f; 根据 openai 对其的解释是&…

若依框架前端调用后台服务报跨域错误

背景&#xff1a;使用若依框架的前后端分离项目&#xff0c;前后端开发在同一个办公室情况下前端调用后端服务提示如下报错&#xff1a;Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源码:构建高效电商平台的利器

一、PHP商城源码的核心优势 1. **开源免费&#xff0c;降低成本** PHP作为开源语言&#xff0c;拥有庞大的开发者社区&#xff0c;成熟的商城源码&#xff08;如EcShop、OpenCart&#xff09;可免费获取&#xff0c;大幅降低企业的技术投入成本。 2. **开发效率高** PHP语法…

【学习笔记】C++代码规范整理

【学习笔记】C代码规范整理 一、匿名空间namespace 匿名命名空间&#xff08;Anonymous Namespace&#xff09;是一种特殊的命名空间声明方式&#xff0c;其作用是将声明的成员限定在当前编译单元&#xff08;源文件&#xff09;内可见&#xff0c;类似于使用 static 关键字修…

数学复习笔记 29 不定积分

前言 复习的时候时常复习一下以前复习的高数&#xff0c;温故而知新&#xff0c;可以为师矣。现实生活中有非常多让我难受的事情&#xff0c;贤者模式的时候也会对一些自己的行为嗤之以鼻&#xff0c;复习考研对其他三门科目都没有学出来正反馈&#xff0c;只能从数学这儿找一…

微软因安全漏洞禁用黑暗环境下的Windows Hello面部识别功能

面部识别技术在各种场景中的应用日益广泛&#xff0c;但身份欺诈事件仍时有发生&#xff0c;这表明即使面部识别也并非万无一失。在某些情况下&#xff0c;这些系统可能被攻击者利用。 漏洞发现与应对措施 近期&#xff0c;微软在Windows 10和11系统中禁用了黑暗环境下使用Wi…

产品经理课程(十五)实战点评(3)

&#xff08;一&#xff09;复习 需求文档是产品的说明书 需求文档包含&#xff1a;修订记录、背景、主要流程、详细功能逻辑、数据上报&#xff0c;发布策略 bug也是需求文档的一部分 &#xff08;二&#xff09;案例讲解 案例一&#xff1a; 一个版本里面的4-5个功能点就比…

大模型量化与剪枝

大模型量化&#xff0c;剪枝 量化有助于减少显存使用并加速推理 GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月18日 专栏&#xff1a;Oracle教程 在 Oracle 数据库中&#xff0c;对表内数据进行增加、修改和删除操作是通过数据操作语言 (DML - Data Manipulation Language) 来完成的。核心的DML语句包括 INSERT (插入新数据), UPDATE…

推荐使用的Unity插件(InputSystem)

本文将提供更简洁的步骤和常见问题解决。 一、极简入门步骤&#xff1a; 安装&#xff1a;Package Manager中安装Input System&#xff08;确保Unity版本在2019.4&#xff09; 创建Input Actions&#xff1a; 在Project窗口右键 -> Create -> Input Actions 双击打开…

清理 Docker 容器日志文件方法

操作总结与问题解析 一、操作目的与背景 用户旨在清理 Docker 容器日志文件以释放服务器存储空间,主要通过以下命令组合完成操作: 查看容器日志空间占用清空指定容器的日志文件验证容器运行状态与日志清理效果二、关键命令与输出解析 1. 查看 Docker 容器日志空间占用 du…

图片压缩工具 | 按指定高度垂直切割图片

OPEN-IMAGE-TINY&#xff0c;一个基于 Electron VUE3 的图片压缩工具&#xff0c;项目开源地址&#xff1a;https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 在上一篇文章一段代码利用 snapdom 将 CSDN 博文转化为长图片&#xff08;PNG/JPG/PDF&#xff09;中&…

山东大学软件学院创新项目实训开发日志——第十七周(二)

目录 1.优化前端日历页面显示&#xff0c;增加鼠标悬停显示当日会议基本信息的效果。 2.优化会议计划生成与会议PPT生成功能&#xff0c;使得能够加载多页docx文件与PDF文件 3.优化了会议PPT生成功能&#xff0c;使得可以上传多个文件并根据多个文件生成会议PPT 4.修改了识…

Ubuntu 使用kubeadm部署k8s系统组件反复重启的问题

系统&#xff1a;Ubuntu 24.04 LTS 问题现象&#xff1a;kubeadm init 后系统组件proxy、apiserver、etcd等频繁挂掉重启 问题原因&#xff1a;cgroup配置问题 解决方法&#xff1a; 编辑系统cgroup默认配置文件 sudo nano /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAU…

Oracle获取执行计划之EXPLAIN PLAN 技术详解

#Oracle #执行计划 #EXPLAIN PLAN 一、引言 在Oracle数据库性能优化中&#xff0c;​执行计划&#xff08;Execution Plan&#xff09;​是理解SQL语句如何被数据库处理的关键工具。EXPLAIN PLAN是Oracle提供的一种静态分析SQL执行路径的方法&#xff0c;它通过生成逻辑执行…

【论文阅读】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模态大模型 多模态大模型MultiModal Large Language Models (MM-LLMs) 的发展可以通过一篇综述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch区别

在 Vue 中&#xff0c;computed 和 watch 都是用来响应式地处理数据变化的工具&#xff0c;但它们的用途和行为有明显区别。 &#x1f50d; 一句话总结 computed&#xff1a;用于声明式计算属性&#xff0c;有缓存。 watch&#xff1a;用于监听响应式数据的变化并执行副作用逻…

大语言模型:提示词决定自我反思效果: “检查回答是否错误” “验证回答是否正确”

大语言模型(LLMs)自我反思的结果很容易受提示词构造的影响 大型语言模型(LLMs)展现出令人印象深刻的零样本和少样本推理能力。有人提出,这些能力可以通过自我反思来提升,即让大型语言模型反思自己的输出,以识别和纠正初始回答中的错误。然而,尽管有一些证据表明自我反…

【iReport】实际开发中,解决iReport中打印图片不显示问题

ireport 中增加图片&#xff0c;添加上属性&#xff0c;但是运行时报错如下&#xff0c;是属性logoPath没有声明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL进阶】常用MySQL程序

目录 一. mysqlcheck——表维护程序 1.1.作用 1.2 注意事项 1.3 使用方法 1.4 常用选项 1.5 mysqlcheck的特殊使用 二. mysqldump——数据库备份程序 2.1.作用 2.2 注意事项 2.3 使用方法 2.4 常用选项 三. mysqladmin——MySQL 服务器管理程序 3.1.作用 3.2 使用…