File Blob FileReader ArrayBuffer Base64
Blob
Blob 全称为
binary large object
,即二进制大对象,blob对象本质上是 js 中的一个对象,里面可以储存大量的二进制编码格式的数据。Blob 对象一个不可修改,从 Blob 中读取内容的唯一方法是使用FileReader
创建
new Blob(array, options)
两个参数:
- array: 由
ArrayBuffer
ArrayBufferView
Blob
DOMString
等对象构成的,将会被放进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.size
contentType
: 设置新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
读取里面的内容