参考资料:

一、概述

​ Blob全称为Binary Larget Object,意思是二进制类型大对象,表示用来存储二进制数据,通常在前端用于文件上传,图片预览等等。在 JavaScript 中 Blob 对象表示一个不可变、原始数据的类文件对象,它不一定非得是大量数据,也可以表示一个小型文件的内容。在JS中,File文件对象就是基于Blob,继承 Blob 的功能并将其扩展使其支持用户系统上的文件。

构造方法
const blob = new Blob(blobParts,config)

​ 这个构造方法接收两个参数:

  • blobParts:它是一个由 ArrayBuffer,ArrayBufferView,Blob,DOMString 等对象构成的数组。DOMStrings 会被编码为 UTF-8
  • config:配置属性
    • type:默认值为 "" ,表示将会被放入到 blob 中的数组内容的 MIME 类型
    • endings:默认值为 "transparent",用于指定包含行结束符 \n 的字符串如何被写入。它是以下两个值中的一个:"native",代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者 "transparent",代表会保持 blob 中保存的结束符不变
属性和方法

Blob 对象拥有 2 个属性:

  • size :只读,表示 Blob 对象中所包含的数据大小(以字节为单位);
  • type :只读,值为字符串,表示该 Blob 对象所包含数据的 MIME 类型。若类型未知,则该属性值为空字符串。

方法:

  • slice([start[, end[, contentType]]]) :返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。

  • stream():返回一个能读取 Blob 内容的 ReadableStream

  • text():返回一个 Promise 对象且包含 Blob 所有内容的 UTF-8 格式的 USVString

  • arrayBuffer():返回一个 Promise 对象且包含 Blob 所有内容的二进制格式的 ArrayBuffer

二、方法解析

Blob.slice(start, end, contentType)

返回一个新的Blob对象,包含了源 Blob 对象中指定范围内的数据,start参数代表范围的开始下标,end代表复制范围的结束下标,contentType表示返回的Blob的文档类型。

let blob=new Blob(["这是保存到Blob中的文本数据"],{type:"application/text"})
let newBlob=blob.slice(0,5,"text/html"); console.log(newBlob) // { size: 5,type: "text/html" }
Blob.stream()

返回一个能读取blob内容的 ReadableStream流,ReadableStream对象包含的方法有很多,这里不展开讨论,仅示例读取

let blob=new Blob(["这是保存到Blob中的文本数据"],{type:"application/text"})
var stream = blob.stream();
let reader=stream.getReader()
reader.read().then(content=> { console.log(content) }); // 这里的content是一个对象 { value: Unit8Array, done: false } // 可以对Unit8Array进行解码
reader.read().then(content=> {
const textDecoder = new TextDecoder();
console.log(content);
const decodeText = textDecoder.decode(content.value);
console.log(decodeText) // 这是保存到Blob中的文本数据
});
Blob.text()

返回一个promise且包含blob所有内容的UTF-8格式的 USVString

let blob=new Blob(["这是保存到Blob中的文本数据"],{type:"application/text"})
let textPromise = blob.text();
blob.text().then(text => console.log(text)); // 这是保存到Blob中的文本数据
Blob.arrayBuffer()

返回一个promise且包含blob所有内容的二进制格式的 ArrayBuffer

let blob=new Blob(["这是保存到Blob中的文本数据"],{type:"application/text"})
var bufferPromise = blob.arrayBuffer(); blob.arrayBuffer().then(buffer => {
console.log(buffer) // 返回ArrayBuffer对象
});

三、用法示例

简单的字符串创建

利用字符串来创建Blob对象,并指定他们的类型

const a = '1,2,3';
const b = '<div style="color: red">test</div>';
const obj = { name: 'xiaoming', age: 18 }; const b1 = new Blob([a], { type: 'text/plain' });
const b2 = new Blob([b], { type: 'text/html' });
const b3 = new Blob([JSON.stringify(obj)], { type: 'application/json' });
const b4 = new Blob([obj]); console.log(b1);
console.log(b2);
console.log(b3);
console.log(b4);
从类型化数组和字符串创建 Blob

JavaScript类型化数组是一种类似数组的对象,并提供了一种用于 访问原始二进制数据的机制

let hello = new Uint8Array([72, 101, 108, 108, 111]); // 二进制格式的 "hello"
let blob = new Blob([hello, ' ', 'leo'], {type: 'text/plain'});
// Output: "Hello leo"
组装新的 Blob
let blob1 = new Blob(['<html><h2>Hello Leo</h2></html>'], {type : 'text/html'});
let blob2 = new Blob(['<html><h2>Happy Boy!</h2></html>'],{type : 'text/html'});
let slice1 = blob1.slice(16);
let slice2 = blob2.slice(0, 16); await slice1.text();
// currtent slice1 value: "Leo</h2></html>"
await slice2.text();
// currtent slice2 value: "<html><h2>Happy " let newBlob = new Blob([slice2, slice1], {type : 'text/html'});
await newBlob.text();
// currtent newBlob value: "<html><h2>Happy Leo</h2></html>"

四、使用场景

图片本地预览
<body>
<h1>1.DataURL方式:</h1>
<input type="file" accept="image/*" onchange="selectFileForDataURL(event)">
<img id="output1"> <h1>2.Blob方式:</h1>
<input type="file" accept="image/*" onchange="selectFileForBlob(event)">
<img id="output2"> <script>
// 1.DataURL方式:
async function selectFileForDataURL() {
const reader = new FileReader();
reader.onload = function () {
const output = document.querySelector("#output1")
output.src = reader.result;
}
reader.readAsDataURL(event.target.files[0]);
} //2.Blob方式:
async function selectFileForBlob(){
const reader = new FileReader();
const output = document.querySelector("#output2");
const imgUrl = window.URL.createObjectURL(event.target.files[0]);
output.src = imgUrl;
reader.onload = function(event){
window.URL.revokeObjectURL(imgUrl);
}
}
</script>
</body>

下载文件

<body>
<button onclick="download()">Blob 文件下载</button> <script>
function download(){
const fileName= "Blob文件.txt";
const myBlob = new Blob(["一文彻底掌握 Blob Web API"], { type: "text/plain" });
downloadFun(fileName, myBlob);
}
function downloadFun(fileName, blob){
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = fileName;
link.click();
link.remove();
URL.revokeObjectURL(link.href);
}
</script>
</body>

搞懂前端二进制系列(一):🍇 认识Blob对象的更多相关文章

  1. 搞懂前端二进制系列(二):🍈File、FileReader与Base64

    参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...

  2. HTML5新特性之文件和二进制数据的操作 Blob对象

    HTML5新特性之文件和二进制数据的操作 1.Blob对象 2.FileList对象 3.File对象 4.FileReader 对象 5.URL对象

  3. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  4. [HTML5] Blob对象

    写在前面 本篇主要总结Blob对象属性及作用,通过DEMO介绍Blob对象的应用场景. Blob对象 一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操 ...

  5. 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  6. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  7. 【前端知乎系列】ArrayBuffer 和 Blob 对象

    本文首发在 个人博客 更多丰富的前端学习资料,可以查看我的 Github: <Leo-JavaScript>,内容涵盖数据结构与算法.HTTP.Hybrid.面试题.React.Angul ...

  8. 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输

    HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...

  9. 野路子码农系列(8)我终于大致搞懂了GBDT

    由于下下周要在组里介绍一个算法,最近开始提前准备,当初非常自信地写下自己最喜欢的GBDT,但随着逐步深入,发现其实自己对这个算法的细节并不是非常了解,了解的只是一些面试题的答案而已……(既然没有深入了 ...

随机推荐

  1. Idea之常用插件

    效率提升 Jrebel 热部署插件,修改代码编译就生效,节省大量重启服务时间.热部署支持修改方法代码,方法定义,类定义,接口定义(包括swagger文档),修改资源文件,修改mapper.xml(需配 ...

  2. ElasticSearch7.3学习(二十五)----Doc value、query phase、fetch phase解析

    1.Doc value 搜索的时候,要依靠倒排索引: 排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序. 所谓的正排索引,其实就是doc values. 在建立索引 ...

  3. 【mq】从零开始实现 mq-12-消息的批量发送与回执

    前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...

  4. WSL2+Docker+IDEA一站式开发调试

    WSL2+Docker+IDEA一站式开发调试 前言 ​ 我们知道,Docker是一个容器引擎:对于开发者来说,使用Dokcer容器部署各种开发需要的中间件(比如myql.redis)会非常简单方便: ...

  5. JavaScript数组操作常用方法

    @ 目录 数组基础遍历方法. for for of for in 数组的基础操作方法. push:尾部追加元素 pop:尾部移出元素 unshift:头部追加元素 shift:头部移出元素 splic ...

  6. 123_Power Pivot&Power BI DAX函数说明速查

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 说明 1.基于DAX Studio 2.9.2版本导出整理: 2.DAX Studio网站,及时更新下载,DAX学习利器: ...

  7. 一文学完Linux常用命令

    一.Linux 终端命令格式 1.终端命令格式 完整版参考链接:Linux常用命令完整版 command [-options] [parameter] 说明: command : 命令名,相应功能的英 ...

  8. 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用

    微软的Workflow Foundation基于.Net Framework,并且没有向.Net Core迁移的计划.我们的很多项目使用了工作流引擎,这些项目向.Net Core以及更高版本迁移时遇到 ...

  9. 《Unix 网络编程》13:守护进程和 inetd 超级服务器

    守护进程和 inetd 超级服务器 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  10. VMware虚拟机基于contos 7 搭建lnmp环境全过程

    这个环境也整了几次了,由于本人比较懒,没有记住.找资料很麻烦,就自己动手咯 1.下载VMware虚拟机   (有注册码)     地址:http://www.zdfans.com/5928.html ...