前端速通Blob、File、FileReader、ArrayBuffer、Base64...

提示:记录工作中遇到的需求及解决办法

文章目录

  • 前言
  • Blob
    • 基本使用
    • 使用场景
  • File
    • 基本使用
    • 支持 Blob 和 File 对象的 API
    • FileReader
      • FileReader 实例属性
      • FileReader 实例方法
      • 事件
  • Base64
    • 术语解释
    • Base64 编码原理
    • 示例
    • Base64 的应用场景
    • 总结
  • URL.createObjectURL()
    • 基本使用
    • 使用场景
    • 示例
  • ArrayBuffer、TypedArray 、DataView
  • 基本使用
    • 完整示例
  • 总结


前言

在前端开发的旅途中,我们总会与 Blob、File、FileReader、ArrayBuffer、Base64、URL.createObjectURL() 这些“老朋友”不期而遇。通常,我们会祭出“万能”搜索引擎,复制粘贴一段代码,完成任务后便拍拍手走人,从未深究这些概念背后的奥秘。是时候痛下决心,抽出十分钟,一起搞懂这些“神秘代码”的真相!让我们在开发的江湖中,不再只是“复制侠”,而是“代码大师”!


Blob

Blob 对象表示一个不可变、原始数据的 「类文件」 对象。它的数据可以按文本 (text()方法) 或二进制(arrayBuffer()方法)的格式进行读取,也可以转换成 ReadableStream (stream()方法)可读流来用于数据操作。Blob 提供了一种高效的方式来操作数据文件,而不需要将数据全部加载到内存中(比如流式读取、文件切片 slice() 方法),这在处理大型文件或二进制数据时非常有用。

Blob 表示的不一定是 JavaScript 原生格式的数据,它还可以用来存储文件、图片、音频、视频、甚至是纯文本等各种类型的数据。

File 接口基于 Blob,继承了 blob 的功能并将其扩展以支持用户系统上的文件。

基本使用

可以使用 new Blob() 构造函数来创建一个 Blob 对象:

new Blob(blobParts)
new Blob(blobParts, options)
  1. blobParts (可选):一个可迭代对象,比如 Array,包含 ArrayBuffer、TypedArray、DataView、Blob、字符串或者任意这些元素的混合,这些元素将会被放入 Blob 中。
  2. options (可选):可以设置 type (MIME 类型)和 endings (用于表示换行符)。
const blob1 = new Blob(["Hello, world!"], { type: "text/plain" });
const blob2 = new Blob(['<q id="a"><span id="b">hey!</span></q>'], { type: "text/html" });

在这里插入图片描述
Blob 对象主要有以下几个属性:

  1. size: 返回 Blob 对象的大小(以字节为单位)。
console.log(blob.size); // 输出 Blob 的大小
  1. type: 返回 Blob 对象的 MIME 类型。
console.log(blob.type); // 输出 Blob 的 MIME 类型

Blob 对象提供了一些常用的方法来操作二进制数据。

  1. slice([start], [end], [contentType])
    该方法用于从 Blob 中提取一部分数据,并返回一个 「新的 Blob 对象」。参数 start 和 end 表示提取的字节范围,contentType 设置提取部分的 MIME 类型。
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
const partialBlob = blob.slice(0, 5);
  1. text()
    该方法将 Blob 的内容读取为文本字符串。它返回一个 Promise,解析为文本数据。
blob.text().then((text) => {  console.log(text); // 输出 "Hello, world!"
});
  1. arrayBuffer()
    该方法将 Blob 的内容读取为 ArrayBuffer 对象,适合处理二进制数据。它返回一个 Promise,解析为 ArrayBuffer 数据。
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
blob.arrayBuffer().then((buffer) => {  console.log(buffer);
});

在这里插入图片描述
4. stream()
该方法将 Blob 的数据作为一个 ReadableStream 返回,允许你以流的方式处理数据,适合处理大文件。

const blob = new Blob(["Hello, world! This is a test Blob."], { type: 'text/plain' });
// 获取 Blob 的可读流
const readableStream = blob.stream();
// 创建一个默认的文本解码器
const reader = readableStream.getReader();
// 用于读取流并输出到控制台
function readStream () {reader.read().then(({ done, value }) => {if (done) { console.log('Stream complete'); return; }// 将 Uint8Array 转换为字符串并输出    console.log(new TextDecoder("utf-8").decode(value));// 继续读取下一个块    return reader.read().then(processText);}).catch(err => {console.error('Stream failed:', err);});
}
readStream();

一个更复杂的示例:将一个 Blob 的内容流式读取并将其写入到另一个流中(了解即可)

const blob = new Blob(["Hello, world! This is a test Blob."], { type: 'text/plain' });
// 使用 Blob.stream() 方法获取一个可读流
const readableStream = blob.stream();
// 创建一个新的 Response 对象,以便使用 Response.body 作为可读流
const response = new Response(readableStream);
// 使用 TextDecoderStream 将二进制流转换为字符串
const textDecoderStream = new TextDecoderStream();
readableStream.pipeTo(textDecoderStream.writable);
// 获取解码后的可读流
const decodedStream = textDecoderStream.readable;
// 创建一个可写流目标,通常是显示在页面上或传输到服务器
const writableStream = new WritableStream({write (chunk) {console.log(chunk); // 在控制台输出解码后的文本    // 这里你可以将数据写入到某个地方,比如更新网页内容或上传到服务器  }, close () {console.log('Stream complete');}
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485294.html

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

相关文章

深入理解网络安全等级保护:保障信息安全的关键策略与实践

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。为了应对这一挑战&#xff0c;网络安全等级保护制度应运而生&#xff0c;旨在确保不同等级的信息和信息系统的安全。本文将探讨网络安全等级保护的基本概念、重要性及其实践方法。 一、信息安全等级保护的基本概念 1…

Angular由一个bug说起之十一:排序之后无法展开 Row

问题现象 在使用 Material Table 时&#xff0c;排序功能触发了一个奇怪的 Bug&#xff1a;表格的 Row 无法展开。最终排查发现&#xff0c;问题的根源在于 trackBy 的错误使用。trackBy 方法接受两个参数&#xff1a;index&#xff08;数据索引&#xff09;和 row&#xff08;…

MySQL语句学习第三篇_数据库

MySQL语句学习第三篇_数据库 专栏记录MySQL的学习&#xff0c;感谢大家观看。 本章的专栏&#x1f4da;➡️MySQL语法学习 本博客前一章节指向➡️MySQL语句学习第二篇 本人的博客➡️:如烟花般绚烂却又稍纵即逝的主页 文章目录 MySQL的基础操作&#xff08;改与查&#xff0…

代码随想录Day35 本周小结动态规划,动态规划:01背包理论基础,动态规划:01背包理论基础(滚动数组),416. 分割等和子集。

1.本周小结动态规划 周一 动态规划&#xff1a;不同路径 (opens new window)中求从出发点到终点有几种路径&#xff0c;只能向下或者向右移动一步。 我们提供了三种方法&#xff0c;但重点讲解的还是动规&#xff0c;也是需要重点掌握的。 dp[i][j]定义 &#xff1a;表示从…

ceph存储池

1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区&#xff0c;专门用来存储对象的 特点 将文件切片成对象&#xff0c;通过hash算法&#xff0c;找到存储池中的pg&#xff0c;池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响&#xff0c;过多和过少…

知从科技闪耀汽车智能底盘大会:共探软件安全新篇章

在汽车科技蓬勃发展的浪潮中&#xff0c;智能底盘技术正成为引领行业变革的关键力量。11月27日-28日&#xff0c;盖世汽车 2024 第四届汽车智能底盘大会盛大召开&#xff0c;上海知从科技有限公司受邀出席此次盛会&#xff0c;与众多汽车领域的精英齐聚一堂&#xff0c;共话智能…

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

Python 调用 Umi-OCR API 批量识别图片/PDF文档数据

目录 一、需求分析 二、方案设计&#xff08;概要/详细&#xff09; 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时&#xff0c;往往基于过往采购合同数据&#xff0c;给出现在采购或报价的金额…

MySQL用法---MySQL Workbench创建数据库和表

1. 连接数据库 打开软件&#xff0c;点击左下角卡片&#xff0c;输入设置的数据库密码&#xff0c;勾选单选框 2. 了解主页面的组成部分 3. 创建数据库 先点击工具栏的创建按钮 再输入数据库名称 点击 Apply 创建 4. 创建数据表 展开数据库&#xff0c;在Tables上右键&…

Leecode刷题C语言之可以被进一步捕获的棋子数

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt 0, st 0, ed 0;int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};for (int i 0; i < 8; i) {for (int j…

Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需求时间序列数据...

全文链接&#xff1a;https://tecdat.cn/?p38496 分析师&#xff1a;Pengyuan Wen 在当今经济研究与商业决策领域&#xff0c;精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标&#xff0c;其发展趋势的精准把握对中…

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程&#xff1a; kubectl向apiserver发送部署请求&#xff08;例如使用 kubectl create -f deployment.yml&#xff09;apiserver将 Deployment 持久化到etcd&#xff1b;etcd与apiserver进行一次http通信。controller manager通过watch a…

DevOps系统设计和技术选型

命名是一件痛苦的事情&#xff0c;除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适&#xff0c;或者是什么类型的系统&#xff0c;想去想来不知所措&#xff0c;后来想想这么小的东西纠结什么&#xff0c;先从小的细节一点点来&#xff0c;能用就行&#xff0c;就用…

大模型基础环境部署之二:安装CUDA(详细实操版)

在完成 Nvidia 驱动的安装之后&#xff0c;接下来进行 CUDA 的安装以及版本确认。 一、安装 CUDA 1、运行 CUDA 安装程序 /mnt/data/Nvidia/CUDA# ./cuda_12.1.0_530.30.02_linux.run在安装过程中&#xff0c;确保不要选择安装驱动&#xff0c;以免覆盖已经安装好的 Nvidia …

在 Ansys Mechanical 中使用命名选择

介绍 在设置模型时&#xff0c;我通常会使用几何选择选项来确定边界条件、载荷、材料属性和模型的其他重要方面的范围。 这对于没有很多面或身体的小模型来说已经足够好了。随着我的模型变得越来越大和越来越复杂&#xff0c;单击确定边界条件和材料属性的范围变得很乏味&…

【Elasticsearch】实现气象数据存储与查询系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

精密制造中智能扭矩系统的关键作用

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。】 电子、半导体、医疗器械等精密制造行业对于产品质量和性能的要求达到了前所未有的高度。在这一背景下&#xff0c;智能扭矩系统成为了确保零部件装配高精度和一致性的关键要素&#xff0c;对提升…

使用mtools搭建MongoDB复制集和分片集群

mtools介绍 mtools是一套基于Python实现的MongoDB工具集&#xff0c;其包括MongoDB日志分析、报表生成及简易的数据库安装等功能。它由MongoDB原生的工程师单独发起并做开源维护&#xff0c;目前已经有大量的使用者。 mtools所包含的一些常用组件如下&#xff1a; mlaunch支…

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…