File 和 Blob两个对象有什么不同

Blob

在 JavaScript 中,Blob(Binary Large Object)对象用于表示不可变的、原始的二进制数据。它可以用来存储文件、图片、音频、视频、甚至是纯文本等各种类型的数据。Blob 提供了一种高效的方式来操作数据文件,而不需要将数据全部加载到内存中,这在处理大型文件或二进制数据时非常有用。
可以使用 new Blob() 构造函数来创建一个 Blob 对象,语法如下:

const blob = new Blob(blobParts, options);
  • blobParts: 一个数组,包含将被放入 Blob 对象中的数据,可以是字符串、数组缓冲区(ArrayBuffer)、TypedArray、Blob 对象等。

  • options: 一个可选的对象,可以设置 type(MIME 类型)和 endings(用于表示换行符)。

例如:

const blob = new Blob(["Hello, world!"], { type: "text/plain" });

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

  • size: 返回 Blob 对象的大小(以字节为单位)
  • type: 返回 Blob 对象的 MIME 类型

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

  • 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);
  • text()
    该方法将 Blob 的内容读取为文本字符串。它返回一个 Promise,解析为文本数据
blob.text().then((text) => {console.log(text); // 输出 "Hello, world!"
});
  • arrayBuffer()
    该方法将 Blob 的内容读取为 ArrayBuffer 对象,适合处理二进制数据。它返回一个 Promise,解析为 ArrayBuffer 数据
const blob = new Blob(["Hello, world!"], { type: "text/plain" });blob.arrayBuffer().then((buffer) => {console.log(buffer);
});
  • stream()
const stream = blob.stream();

Blob 的使用场景

  • 生成文件下载
const blob = new Blob(["This is a test file."], { type: "text/plain" });
const url = URL.createObjectURL(blob); // 创建一个 Blob URL
const a = document.createElement("a");
a.href = url;
a.download = "test.txt";
a.click();
URL.revokeObjectURL(url); // 释放 URL 对象
  • 上传文件
    可以通过 FormData 对象将 Blob 作为文件上传到服务器
const formData = new FormData();
formData.append("file", blob, "example.txt");fetch("/upload", {method: "POST",body: formData,
}).then((response) => {console.log("File uploaded successfully");
});
  • 读取图片或其他文件
    通过 FileReader API 可以将 Blob 对象读取为不同的数据格式。举例来说,可以将 Blob 读取为图片并显示在页面上
 <input type="file" id="fileInput" accept="image/*" /><div id="imageContainer"></div>
const fileInput = document.getElementById("fileInput");const imageContainer = document.getElementById("imageContainer");fileInput.addEventListener("change", function (event) {const file = event.target.files[0];if (file && file.type.startsWith("image/")) {const reader = new FileReader();reader.onload = function (e) {const img = document.createElement("img");img.src = e.target.result;img.style.maxWidth = "500px";img.style.margin = "10px";imageContainer.innerHTML = "";imageContainer.appendChild(img);};reader.readAsDataURL(file);} else {alert("请选择一个有效的图片文件。");}});
  • Blob 和 Base64
    有时可能需要将 Blob 转换为 Base64 编码的数据。可以通过 FileReader 来实现
const reader = new FileReader();
reader.onloadend = function () {const base64data = reader.result;console.log(base64data); // 输出 base64 编码的数据
};reader.readAsDataURL(blob); // 将 Blob 读取为 base64

File

File是 JavaScript 中代表文件的数据结构,它继承自 Blob 对象,包含文件的元数据(如文件名、文件大小、类型等)。File 对象通常由用户通过 <input type="file"> 选择文件时创建,也可以使用 JavaScript 构造函数手动创建。

<input type="file" id="fileInput" />
<script>document.getElementById("fileInput").addEventListener("change", (event) => {const file = event.target.files[0];console.log("文件名:", file.name);console.log("文件类型:", file.type);console.log("文件大小:", file.size);});
</script>

可以使用 File 的方式来访问用户上传的文件,我们也可以手动创建 File 对象

const file = new File(["Hello, world!"], "hello-world.txt", {type: "text/plain",
});console.log(file);

File 对象继承了 Blob 对象的方法,因此可以使用一些 Blob 对象的方法来处理文件数据

  • slice(): 从文件中获取一个子部分数据,返回一个新的 Blob 对象
const blob = file.slice(0, 1024); // 获取文件的前 1024 个字节
  • text(): 读取文件内容,并将其作为文本返回(这是 Blob 的方法,但可以用于 File 对象)
file.text().then((text) => {console.log(text); // 输出文件的文本内容
});
  • arrayBuffer(): 将文件内容读取为 ArrayBuffer(用于处理二进制数据)
file.arrayBuffer().then((buffer) => {console.log(buffer); // 输出文件的 ArrayBuffer
});
  • stream(): 返回一个 ReadableStream 对象,可以通过流式读取文件内容
const stream = file.stream();

总结

  • Blob 是纯粹的二进制数据,它可以存储任何类型的数据,但不具有文件的元数据(如文件名、最后修改时间等)。
  • File 是 Blob 的子类,File 对象除了具有 Blob 的所有属性和方法之外,还包含文件的元数据,如文件名和修改日期。
  • 可以将 File 对象看作是带有文件信息的 Blob。
  • Blob 更加通用,而 File 更专注于与文件系统的交互
const file = new File(["Hello, world!"], "hello.txt", { type: "text/plain" });console.log(file instanceof Blob); // true

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

招联金融内推-2025校招

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

【springboot】使用thymeleaf模板

1. 导入依赖 首先&#xff0c;创建一个Spring Boot项目&#xff0c;并添加Thymeleaf依赖。在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifa…

组合逻辑元件与时序逻辑元件

组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块&#xff0c;但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入&#xff0c;而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括&#xff1a; 与门 (AND…

美图AI短片创作工具MOKI全面开放 支持生成配乐、细节修改

人工智能 - Ai工具集 - 集合全球ai人工智能软件的工具箱网站 美图公司近日宣布&#xff0c;其研发的AI短片创作工具MOKI已正式向所有用户开放。这款专注于AI短片创作的工具&#xff0c;提供了包括动画短片、网文短剧等多种类型视频内容的生成能力&#xff0c;致力于为用户带来…

文件防泄密措施有哪些?6个方法有效防止文件泄密

想象一下&#xff0c;一群穿着黑衣的神秘人在电影中潜入高保安办公室&#xff0c;绕过各种高科技安保装置&#xff0c;只为偷走里面存放的饱含机密的文件&#xff01; 听起来是不是很刺激&#xff1f; 但如果这种情况发生在现实中&#xff0c;而且发生在你的企业或个人数据上…

【中级通信工程师】综合能力:2024年真题回顾(附答案)

【零基础3天通关中级通信工程师】 综合能力&#xff1a;2024年真题回顾 本文是根据参加考试的回忆并且结合网上几版资料复原的2024年通信考试中级《综合能力》的真题考卷&#xff0c;旨在为广大考生提供复习和备考的参考&#xff0c;试卷大体和真题相符&#xff0c;部分选项回…

互联网全景消息(6)之RocketMq-NameServer源码分析

一、RocketMQ介绍 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双 11 使用的核心产品。 二、…

[Linux]:线程(二)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 与Windows环境不同&#xff0c;我们在linux环境下需要通过指令进行各操作&…

MAC的几个常见的快捷方式

1.mac 查看图片好的方式 默认查看图片的方式无法直接切换上一张下一张 解决方法&#xff1a; 1.&#xff08;最好的方法&#xff09;选中图片直接按空格&#xff0c;进入快速预览图片 2.就是全部选中然后打开&#xff0c;但是说实话有点奇怪&#xff0c;而且很占内存 3.直接显示…

【JAVA开源】基于Vue和SpringBoot的网上租赁系统

本文项目编号 T 050 &#xff0c;文末自助获取源码 \color{red}{T050&#xff0c;文末自助获取源码} T050&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 用…

[Linux]:线程(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 初识线程 1.1 线程的概念 在操作系统中&#xff0c;进程与线程一直是我们…

Vivado - JTAG to AXI Master (GPIO、IIC、HLS_IP)

目录 1. 简介 2. JTAG to AXI Master 2.1 添加 IP Core 2.2 基本TCL命令 2.2.1 复位 JTAG-to-AXI Master 2.2.2 创建并运行写入传输事务 2.2.3 创建并运行读取传输事务 2.2.4 命令列表 2.3 帮助信息 2.4 创建TCL读写程序 2.4.1 Read proc 2.4.2 Write proc 2.4.3 …

cuda程序编译流程

cuda程序编译流程 本文以cuda example的matrixMul矩阵乘法为例说明cuda程序的编译流程。 1. 源代码 .cu 文件 在matrixMul示例中&#xff0c;源代码文件 matrixMul.cu 是典型的CUDA程序&#xff0c;包含以下部分&#xff1a; 流程图 主机代码&#xff08;Host Code&#xf…

GNSS定位中自适应调整电离层延迟参数过程噪声的方法

文章目录 前言一、非差非组合PPP模型二、电离层功率谱密度计算三、具体实现方法3.1 不平滑3.2 三阶多项式平滑 参考文献 前言 GNSS定位中不少技术手段如PPP和长基线RTK需要将电离层延迟作为参数估计&#xff0c;电离层延迟的变化通常被描述为随机游走过程&#xff0c;而功率谱密…

1.2.1 计算机网络分层结构(上)

体系结构可分层使得不同的层次承担不同的功能。 知识点&#xff1a; 1.不同类型的节点&#xff0c;实现的功能层次可能不一样。 2.分层结构的设计并不唯一&#xff0c;可以根据实际需求增加或减少层次。 3.一个功能可以放在不同的层次反复出现。 根据分层结构不同可以分为&…

CORE MVC 过滤器 (筛选器)《2》 TypeFilter、ServiceFilter

TypeFilter、ServiceFilter ServiceFilter vs TypeFilter ServiceFilter和TypeFilter都实现了IFilterFactory ServiceFilter需要对自定义的Filter进行注册&#xff0c;TypeFilter不需要 ServiceFilter的Filter生命周期源自于您如何注册&#xff08;全局、区域&#xff09;&…

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…

STM32LL库之printf函数重定向

1. 加入以下代码 int fputc(int ch,FILE *f) {LL_USART_TransmitData8(USART1,ch);while(!LL_USART_IsActiveFlag_TXE(USART1));//需要等待发送完成return(ch); }记得添加 stdio.h 头文件 2. 在MDK中勾选&#xff1a;Use MicroLIB

swiper+fixed的错误,splice函数的使用,提取年月日substring

做项目时的一些问题 swiperfixedsplice函数的使用重点在 alldata.splice(0, alldata.length, ...response.data.data);splicealldata.splice(0, alldata.length, ...response.data.data) 这行代码的功能为什么不直接赋值 提取年月日 substring swiperfixed 项目中的一个错误&a…

【人人都是P8程序员】Cursor 使用的十大技巧

Cursor 使用的十大技巧 总是在一个空的文件夹中创建一个新的项目 表述需求时尽量明确但谨慎 让Cursor从项目一开始就写README文档&#xff0c;让其记录清楚产品功能、实现技术栈等等&#xff0c;并在完成关键步骤后对README文档做及时的更新&#xff0c;第二天继续完成项目时…