搞懂前端二进制系列(一):🍇 认识Blob对象
参考资料:
一、概述
Blob全称为Binary Larget Object,意思是二进制类型大对象,表示用来存储二进制数据,通常在前端用于文件上传,图片预览等等。在 JavaScript 中 Blob 对象表示一个不可变、原始数据的类文件对象,它不一定非得是大量数据,也可以表示一个小型文件的内容。在JS中,File文件对象就是基于Blob,继承 Blob 的功能并将其扩展使其支持用户系统上的文件。
构造方法
const blob = new Blob(blobParts,config)
这个构造方法接收两个参数:
blobParts:它是一个由 ArrayBuffer,ArrayBufferView,Blob,DOMString 等对象构成的数组。DOMStrings 会被编码为 UTF-8config:配置属性- type:默认值为
"",表示将会被放入到 blob 中的数组内容的 MIME 类型 - endings:默认值为
"transparent",用于指定包含行结束符\n的字符串如何被写入。它是以下两个值中的一个:"native",代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者"transparent",代表会保持 blob 中保存的结束符不变
- type:默认值为
属性和方法
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对象的更多相关文章
- 搞懂前端二进制系列(二):🍈File、FileReader与Base64
参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...
- HTML5新特性之文件和二进制数据的操作 Blob对象
HTML5新特性之文件和二进制数据的操作 1.Blob对象 2.FileList对象 3.File对象 4.FileReader 对象 5.URL对象
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- [HTML5] Blob对象
写在前面 本篇主要总结Blob对象属性及作用,通过DEMO介绍Blob对象的应用场景. Blob对象 一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操 ...
- 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- 【前端知乎系列】ArrayBuffer 和 Blob 对象
本文首发在 个人博客 更多丰富的前端学习资料,可以查看我的 Github: <Leo-JavaScript>,内容涵盖数据结构与算法.HTTP.Hybrid.面试题.React.Angul ...
- 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输
HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...
- 野路子码农系列(8)我终于大致搞懂了GBDT
由于下下周要在组里介绍一个算法,最近开始提前准备,当初非常自信地写下自己最喜欢的GBDT,但随着逐步深入,发现其实自己对这个算法的细节并不是非常了解,了解的只是一些面试题的答案而已……(既然没有深入了 ...
随机推荐
- Nginx代理websocket为什么要这样做?
Nginx反向代理websocket 示例: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } s ...
- 最新版2022年任我行管家婆工贸版ERP M7 V22.0进销存财务生产管理软件网络版——云上的集团化制造管理系统
在互联网+制造业的时代背景下,制造业在利用互联网技术进行转型升级的同时,也面临着供应链体系和生产模式的重塑,主要呈现出以下特点: 多元化发展 对外,传统企业正在通过"互联网+"逐步 ...
- kernel 劫持seq_operations && 利用pt_regs
kernel 劫持seq_operations && 利用pt_regs 劫持seq_operations进行栈迁移 seq_operations是一个大小为0x20的结构体,在打开/ ...
- Centos7部署Redis集群
Redis简介 Redis(Remote Dictionary Server)是完全开源的.遵守BSD协议的.高性能的Key-Value数据库. Redis与其他Key-Value缓存产品有一下三个特 ...
- Spring Boot 2.7.0发布,2.5停止维护,节奏太快了吧
这几天是Spring版本日,很多Spring工件都发布了新版本, Spring Framework 6.0.0 发布了第 4 个里程碑版本,此版本包含所有针对 5.3.20 的修复补丁,以及特定于 6 ...
- Nginx基本配置与应用
一.准备 1.1 环境准备 CentOS7软件环境 1.2 tomcat多实例 把/etc/profile.d/tomcat.sh中的变量注释了 #export TOMCAT_HOME=/usr/lo ...
- Python技法:用argparse模块解析命令行选项
1. 用argparse模块解析命令行选项 我们在上一篇博客<Linux:可执行程序的Shell传参格式规范>中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各 ...
- 129_Power Pivot&Power BI DAX不同维度动态展示&动态坐标轴
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 某天在和那还是叫我大铁吧 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙. 下面来看看到 ...
- MySQL - 数据库的隔离级别
MySQL - 数据库的隔离级别 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitte ...
- csv.reader(f)和f.readlines()、追加数据
假如某个文档f中存储如下内容: 你好,中国. 1,2,3,4 共两行内容. 当你使用csv.reader(f),则会存储为如下形式: [['你','好','中','国'] ['1','2','3',' ...