深入解析 JavaScript 中的 Blob 对象:二进制数据处理的核心

文章目录

      • 1.`Blob`是什么
      • 2.`Blob`用法
        • 实例属性
        • Blob方法
          • `slice`方法
          • `text`方法
        • 示例1:字符串 Blob
        • 示例2:数组和字符串 Blob
        • 示例3:从文件输入创建
      • 3.使用场景
        • 1.创建 Blob 并生成 URL,下载文件
        • 2.文件上传
        • 3.切片上传
        • 3.Blob用于URL
          • 在线预览PDF文件
        • 4.Blob 转换为 Base64

1.Blob是什么

Blob(Binary Large Object)对象用于表示不可变的、原始数据的类文件对象。它的内容可以包含任何类型的数据:文本、图片、音频、视频等。Blob 对象通常用于在客户端存储文件或从网络上传输文件。
它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

2.Blob用法

Blob构造函数

new Blob(array,options)
  • array: 一个包含 ArrayBuffer、TypedArray(如 Int8Array)、Blob 或字符串等元素的数组,这些元素将被组合成一个新的 Blob
  • options:可选
    ○ type:一个字符串,指定Blob的MIME类型,默认是空字符串
    ○ endings:在处理文本时,可以指定为 “transparent”(默认值)或 “native”。此选项仅适用于包含换行符的文本内容,指定了如何解释 \n 和 \r\n 换行序列

ArrayBuffer、TypedArray 和 Int8Array 是 什么

实例属性
  • Blob.size
    • Blob 对象中所包含数据的大小(字节)
  • Blob.type
    • 一个字符串,表明该 Blob 对象所包含数据的 MIME 类型。如果类型未知,则该值为空字符串
Blob方法
slice方法

slice([start[, end[, contentType]]]):创建并返回一个新的 Blob,该 Blob 包含了源 Blob 中从 start 到 end(不包括 end)的数据副本。如果指定了 contentType 参数,则新 Blob 的 MIME 类型会设置为此值

const blob = new Blob(['Hello, world!'], { type: 'text/plain' });
const slicedBlob = blob.slice(0, 5); // 创建包含 "Hello" 的新 Blob
text方法

text()方法会返回一个Promise,返回一个包含 blob 内容的 UTF-8 格式的字符串

const blob = new Blob(['Hello, world!'], { type: 'text/plain' });
const textBlob = blob.text().then(console.log()); // 输出:Hello,world!
示例1:字符串 Blob
let BlobParts = ['<h1>这是一个Blob数据</h1>']; 
let blob = new Blob(BlobParts, {type : 'text/html', endings: "transparent"}); console.log(blob.size);
// 输出: 19 
console.log(blob.type);
// 输出: text/html 
示例2:数组和字符串 Blob
let hello = new Uint8Array([72, 101, 108, 108, 111]); 
let blob = new Blob([hello, ' ', 'webRookie'], {type: 'text/plain'});console.log(blob.size);
// 输出: 15 
console.log(blob.type);
// 输出: text/html 
示例3:从文件输入创建
<input type="file" id="fileInput">
<script>
document.getElementById('fileInput').addEventListener('change', function(event) {const file = event.target.files[0]; // File 是 Blob 的子类if (file) {console.log(file); // 直接使用 file 作为 Blob}
});
</script>

3.使用场景

1.创建 Blob 并生成 URL,下载文件
const text = 'Hello, world!';
const blob = new Blob([text], { type: 'text/plain' });
const url = window.URL.createObjectURL(blob);// 使用生成的 URL 预览或下载文件
const a = document.createElement('a');
a.style.display = "none";
a.href = url;
a.download = 'hello.txt';
// a.setAttribute("download","hello.txt")
document.body.appendChild(a);
a.click();// 清理
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
2.文件上传
<input type="file" id="fileInput">
<script>
document.getElementById('fileInput').addEventListener('change', function(event) {const file = event.target.files[0];const formData = new FormData();formData.append('file', file);fetch('/upload', {method: 'POST',body: formData,}).then(response => response.json()).then(data => console.log(data)).catch(error => console.error('Error:', error));
});
</script>
3.切片上传

待定

3.Blob用于URL

Blob 对象可以通过 window.URL.createObjectURL() 方法转换为一个临时的 URL,这个 URL 可以用于立即引用 Blob 中的数据,而无需将数据上传到服务器或存储在文件系统中。这种方式非常适合于在线预览文件、处理多媒体内容以及创建下载链接等场景。
基本步骤

  1. 创建 Blob 对象:可以是通过构造函数直接创建,也可以从其他 API(如 fetch 或 FileReader)获取。
  2. 生成对象 URL:使用 URL.createObjectURL(blob) 创建一个指向 Blob 的 URL。
  3. 使用对象 URL:将生成的 URL 应用到<img>、<a>、<iframe>、<video>等元素上,以便可以直接展示或操作 Blob 数据。
  4. 释放对象 URL:当不再需要该 URL 时,调用 URL.revokeObjectURL(url) 来释放内存资源
在线预览PDF文件
<input type="file" id="pdfInput">
<script>
document.getElementById('pdfInput').addEventListener('change', function(event) {const file = event.target.files[0];if (file) {const iframe = document.createElement('iframe');iframe.src = window.URL.createObjectURL(file);iframe.style.width = '100%';iframe.style.height = '500px';document.body.appendChild(iframe);// 清理iframe.onload = () => window.URL.revokeObjectURL(iframe.src);}
});
</script>
4.Blob 转换为 Base64

Blob 转换为 Base64 编码的字符串需要将二进制数据嵌入到 HTML 或 CSS 中时。转换过程通常涉及到使用 FileReader 对象的 readAsDataURL() 方法。这个方法会读取文件的内容,并返回一个包含 Base64 编码的数据 URL。

基本步骤

  1. 创建 FileReader 实例。
  2. 监听 load 事件:当文件读取完成时触发,可以在事件处理程序中获取结果。
  3. 调用 readAsDataURL() 方法:开始读取 Blob,完成后会触发 load 事件。
  4. 处理结果:从 FileReader 的 result 属性中提取 Base64 编码的字符串。
function blobToBase64(blob) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onloadend = () => {// result 包含 data URL,格式为 "data:[<mediatype>][;base64],<data>"resolve(reader.result.split(',')[1]); // 只取 base64 编码部分};reader.onerror = () => {reject(new Error('Error reading the Blob as Base64.'));};reader.readAsDataURL(blob);});
}const text = 'Hello, world!';
const blob = new Blob([text], { type: 'text/plain' });blobToBase64(blob).then(base64String => {console.log('Base64 String:', base64String);
}).catch(error => {console.error('Error converting Blob to Base64:', error);
});

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

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

相关文章

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注&#xff1a;重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解&#xff0c;解压的过程&#xff0c;是如何得到文件头部的meta信息的。 再看解压过程 …

人工智能大模型LLM开源资源汇总(持续更新)

说明 目前是大范围整理阶段&#xff0c;所以存在大量机翻说明&#xff0c;后续会逐渐补充和完善资料&#xff0c;减少机翻并增加说明。 Github上的汇总资源&#xff08;大部分英文&#xff09; awesome-production-machine-learning 此存储库包含一系列精选的优秀开源库&am…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

PlantUML——类图

背景 类图是UML模型中的静态视图&#xff0c;其主要作用包括&#xff1a; 描述系统的结构化设计&#xff0c;显示出类、接口以及它们之间的静态结构和关系。简化对系统的理解&#xff0c;是系统分析与设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 在U…

【Java知识】Java进阶-如何开启远程调式

java远程调试 概述Java远程调试的开启与底层原理开启Java远程调试底层原理 JVM参数 概述 Java远程调试的开启与底层原理 开启Java远程调试 Java远程调试允许开发者在本地IDE&#xff08;如Eclipse、IntelliJ IDEA等&#xff09;中调试运行在远程服务器上的Java应用程序。以下…

入选国家数据局案例!浙江“一体化智能化公共数据平台”总体架构详解~

国家数据局在2024中国国际大数据产业博览会上发布了首批50个数字中国建设典型案例。案例涉及数据基础设施、数据资源、数字技术创新、数字政府、数字经济、数字社会、数字文化、数字生态文明等领域&#xff0c;集中反映了近年来数字中国建设的实践和成效。 其中&#xff0c;由…

vscode IntelliSense Configurations

IntelliSense 是一个强大的代码补全和代码分析功能&#xff0c;它可以帮助开发者提高编程效率。图中显示的是 VSCode 的 IntelliSense 配置界面&#xff0c;具体配置如下&#xff1a; Compiler path&#xff08;编译器路径&#xff09;: 这里指定了用于构建项目的编译器的完整路…

同三维TL200H2S6 6机位精品教育录播主机

录制点播、直播导播、互动、音频处理器、中控等多功能为一体 8路视频输入:6路SDI1路HDMI1(4K30)1路(3选1:HDMI2/2路VGA) 2路视频输出&#xff1a;1路HDMI1(4K30)1路&#…

欢乐斗地主案例

1&#xff0c;创建对象 package anlidoudizhu;public class pai implements Comparable<pai> {private Double value;private String name;Overridepublic int compareTo(pai o) {return -Double.compare(this.value,o.value);}//升序排序&#xff0c;treeset集合public…

技术型企业如何高效搭建企业博客以增强品牌影响力和市场竞争力

在数字化时代&#xff0c;技术型企业面临着激烈的市场竞争和快速变化的行业环境。为了在这场竞争中脱颖而出&#xff0c;企业需要寻找新的营销渠道和品牌建设工具。企业博客作为一种低成本、高效率的在线内容平台&#xff0c;已经成为技术型企业增强品牌影响力和市场竞争力的重…

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…

【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中&#xff0c;限流是一项非常重要的技术手段&#xff0c;用于保护后端服务&#xff0c;防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流&#xff0c;以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…

ubuntu下的chattts 学习5:Example: self introduction

代码 import ChatTTS import torch import torchaudiochat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance ################################### inputs_en """ chat T T S is a text to speech model designed for dialogu…

【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…

HTML:表格重点

用表格就用table caption为该表上部信息&#xff0c;用来说明表的作用 thead为表头主要信息&#xff0c;效果加粗 tbody为表格中的主体内容 tr是 table row 表格的行 td是table data th是table heading表格标题 &#xff0c;一般表格第一行的数据都是table heading

[创业之路-187]:《华为战略管理法-DSTE实战体系》-1-从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机

目录 一、UTStarcom&#xff08;UT斯达康&#xff09;的发展历程 1、创立与初期发展 2、快速成长与上市 3、技术创新与业务拓展 4、战略调整与持续发展 二、从UTStarcom的发展历程&#xff0c;如何辩证的看企业初期发展太顺利中的危机 1、企业初期发展的顺利表现 2、顺…

ubuntu系统生成SSL证书配置https

自签名【Lets Encrypt】的测试证书&#xff0c;有效期三个月。 第一步&#xff1a;安装acme&#xff0c;如果没有安装git&#xff0c;需要提前安装 下载came资源 git clone https://github.com/Neilpang/acme.sh.git 无法访问&#xff0c;可以试用gitee的资源&#xff0c;安…

CentOS 7 环境下常见的操作和配置

目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd&#xff08;/etc/vsftpd/vsftpd.conf&#xff09; 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…