File Blob FileReader ArrayBuffer Base64

Blob
Blob 全称为
binary large object,即二进制大对象,blob对象本质上是 js 中的一个对象,里面可以储存大量的二进制编码格式的数据。Blob 对象一个不可修改,从 Blob 中读取内容的唯一方法是使用FileReader
创建
new Blob(array, options)两个参数:
- array: 由
ArrayBufferArrayBufferViewBlobDOMString等对象构成的,将会被放进Blob- options: 它可能会有两个属性:
- type: 默认值为
'',表示将会被放入到blob中数组内容的MIME类型- endings: 默认值为
transparent,用于指定包含结束符\n的字符串如何被写入,不常用
| MIME 类型 | 描述 |
|---|---|
text/plain | 纯文本文档 |
text/html | html文档 |
text/javascript | JavaScript 文件 |
text/css | CSS 文件 |
application/json | JSON 文件 |
application/pdf | PDF 文件 |
application/xml | XML 文件 |
image/jpeg | JPEG 图像 |
image/png | PNG 图像 |
image/gif | GIF 图像 |
image/svg+xml | SVG 图像 |
audio/mpeg | MP3 文件 |
video/mpeg | MP4 文件 |
ts
let blob = new Blob(['helloWorld'], { type: 'text/plain' })

TIP
blob对象上有两个属性:
- size: Blob 对象中所包含的数据大小(字节)
- type: 字符串,认为该对象所包含的 MIME 类型,如果类型未知,则为空字符串
分片
Blob 对象内置可
slice()方法用来将对象分片其有三个参数:
start: 设置切片的起点,即切片开始的位置,默认为0,这意味着切片应该从第一个字节开始end: 设置切片的终点,会对该位置之前的数据进行切片,默认值为blob.sizecontentType: 设置新blob的MIME类型,如果省略type,则默认为blob的原始值

File
File对象是特殊类型的Blob在 js 中,主要有两种方式来获取File对象:
<input>元素上选择文件后返回的FileList对象- 文件拖放操作生成的
DataTransfer对象
html
<input type="file" name="" id="fileId">
<script>
let fileObj = document.getElementById('fileId')
fileObj.onchange = function (e) {
console.log(e.target.files)
}
</script>

html
<style>
.drapArea {
width: 300px;
height: 300px;
border: 1px solid red;
}
</style>
<div class="drapArea" id="dropId" />
<script>
let dropObj = document.getElementById('dropId')
dropObj.ondragover = function (e) {
e.preventDefault()
}
dropObj.ondrop = function (e) {
e.preventDefault()
let files = e.dataTransfer.files
console.log(files)
}
</script>

FileReader
通过上面知道了
blob是不可修改也是无法读取里面的内容的,读取内容需要通过FileReader方法

FileReader 对象提供了以下方法来加载文件:
readerAsArrayBuffer(): 读取指定 Blob 中的内容,完成之后,result属性中保存的将是被读取文件ArrayBuffer数据对象readerAsBinaryString(): 读取指定 Blob 中的内容,完成之后,result属性中将包含所读文件原始二进制数据readerAsDataURL(): 读取指定 Blob 中的内容,完成之后,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容readerAsText(): 读取指定 Blob 中的内容,完成之后,result属性中将包含一个字符串表示所读文件内容
html
<input type="file" name="" id="fileId">
<script>
let fileObj = document.getElementById('fileId')
fileObj.onchange = function (e) {
let files = e.target.files
let reader = new FileReader()
reader.readAsDataURL(files[0])
reader.onload = function (event) {
let base64 = event.target.result
console.log(base64)
}
}
</script>


ArrayBuffer
可以理解为特殊的数组:
ArrayBuffer本身就是一个黑盒,不能直接读写所储存的数据,需要借助一下视图对象来读写TypedArray只是一个概念,实际使用的是那9个对象

创建 ArrayBuffer
new ArrayBuffer(bytelength)参数: bytelength 表示要创建数据缓存区的大小,以字节为单位

TypedArray 读写 buffer

DataView 读写 buffer
DataView 实例提供了以下方法来读取内存,他们的参数都是一个字节序号,表示开始读取的字节的位置:
getInt8: 读取1个字节,返回一个8位整数getUnit8: 读取1个字节,返回一个无符号8位整数getInt16: 读取2个字节,返回一个16位整数getUnit16: 读取2个字节,返回一个无符号16位整数getInt32: 读取4个字节,返回一个32位整数getUnit32: 读取4个字节,返回一个无符号32位整数getFloat32: 读取4个字节,返回一个32位浮点数getFloat64: 读取8个字节,返回一个64位浮点数
DataView 实例提供了以下方法来写入内存,它们接收两个参数,第一个参数表示开始写入数据的字节序号,第二个参数为写入的数据:
setInt8: 写入1个字节的8位整数setUint8: 写入1个字节的8位无符号整数setInt16: 写入1个字节的16位整数setUint16: 写入1个字节的16位无符号整数setInt32: 写入1个字节的32位整数setUint32: 写入1个字节的32位无符号整数setInt64: 写入1个字节的64位整数setUint64: 写入1个字节的64位无符号整数
Object URL
用来表示
File Object或Blob Object的URL
html
<input type="file" name="" id="fileId">
<script>
let fileObj = document.getElementById('fileId')
fileObj.onchange = function (e) {
let files = e.target.files
let url = URL.createObjectURL(files[0])
console.log(url)
}
</script>

base64
在 js 中,有两个函数被分别用来处理 解码 和 编码
base64 字符串
atob(): 解码,解码一个 base64字符串btoa(): 编码,从一个 字符串或二进制数据编码一个 base64字符串

TIP
主要作用:
- 将
canvas 画布内容生成base64图片 - 将获取的图片文件,
生成 base64 图片(FileReader:reader.readerAsDataURL)
html
<canvas id="canvasId" width="200" height="200"></canvas>
<script>
let canvas = document.getElementById('canvasId')
let context = canvas.getContext('2d')
context.fillStyle = '#ff0000'
context.fillRect(0, 0, 200, 200)
let base64Str = canvas.toDataURL()
console.log(base64Str)
</script>

总结
ArrayBuffer与Blob有什么区别? 根据ArrayBuffer和Blob的特性,Blob作为一个整体文件,适合用于传输;当需要对二进制数据进行操作时(比如更改某一段数据时),就可以使用ArrayBuffer- 通过
ArrayBuffer创建Blob,然后他通过FileReader读取里面的内容

Nebula 的博客