Blob
由一个可选的字符串 type
(通常是 MIME 类型)和 blobParts
组成:
Blob
相比 TypedArray
、ArrayBuffer
,多了 MIME
类型。
所以可以将 Blob
看做有类型的二进制数据。
1.语法
// !!!注意第一个参数必须是数组序列
new Blob(blobParts, options)
blobParts
:Blob/BufferSource/String
类型值的数组。options
: 可选。type
:Blob
类型,通常是MIME
类型,例如image/png
。默认是application/octet-stream
。endings
: 是否转换换行符,使Blob
对应于当前操作系统的换行符(\r\n
或\n
)。默认为transparent
(啥也不做),不过也可以是native
(转换)。
TIP
BufferSource
是 ArrayBuffer
或 ArrayBufferView
(TypedArray
、DataView
)的总称。
1-1.处理Blob
该处的应用场景主要在文件下载。
关于此处的说明和使用可以查看Blob文件下载
1-2.处理BufferSource
var arr = new Uint8Array([72, 101, 108, 108, 111])
var blob = new Blob([arr])
console.log(blob)
这里,其实还是看不出来 blob
的具体含义表示是什么。
TIP
可以对 blob
进行额外的处理:
Blob
实例上的text()
、stream()
等方法。FileReader
实例上的readAsText()
等方法。- 将
blob
转化为BlobURL
。
1-3.处理String
var str = '<html><p>Hello World</p></html>'
var blob1 = new Blob([str])
console.log(blob1)
var blob2 = new Blob([str], { type: 'text/html' })
console.log(blob2)
在本例中:
不声明 type
时,将来的内容会被当做 text/plain
的形式来显示。
声明 type
为 text/html
,将来的内容会被当做 text/html
的形式来显示,内部的 html
标签会被解析。
可以类比与 innerText
与 innerHtml
方法的区别。
2.方法
Blob
原型上挂载了一些方法,供实例调用。
按照功能划分,大致有两类:
- 读取功能。有
arrayBuffer()
、text()
、stream()
。 - 操作功能。有
slice()
。
2-1.arrayBuffer()
将 blob
读取为 arrayBuffer
:
var arr = new Uint8Array([72, 101, 108, 108, 111])
var blob = new Blob([arr])
blob.arrayBuffer().then(buffer => {
console.log(buffer)
})
2-2.text()
将 blob
读取为普通文本 text
:
var arr = new Uint8Array([72, 101, 108, 108, 111])
var blob = new Blob([arr])
blob.text().then(text => {
console.log(text) // 'Hello'
})
TIP
无论 type
是否设置了 MIME
类型,统一读取为 text/plain
。
2-3.stream()
将 blob
读取为文本流 stream
:
var arr = new Uint8Array([72, 101, 108, 108, 111])
var blob = new Blob([arr])
var readableStream = blob.stream()
var reader = readableStream.getReader()
reader.read().then(res => {
console.log(res) // {value: Uint8Array(5), done: false}
})
返回值形式 {value: Uint8Array(5), done: false}
中的 done
表示是否已经读取转化完。
TIP
有点类似于迭代器的设计。
2-4.slice()
slice()
方法用来截取 blob
。
该方法在现代开发中,可用于大文件断片上传。
该方法类似于 Array
的 slice
方法,可设定长度 [byteStart, byteEnd)
。
基本语法如下:
blob.slice([byteStart], [byteEnd], [contentType])
byteStart
: 起始字节,默认为0
。byteEnd
: 最后一个字节,不包含。contentType
: 新blob
的type
,默认与源blob
相同。
// 截取'Hello'中的前两位
var arr = new Uint8Array([72, 101, 108, 108, 111])
var blob = new Blob([arr])
var sliceBlob = blob.slice(0, 2)
sliceBlob.text().then(text => {
console.log(text) // 'He'
})
3.URL转化
Blob
可以用作 <a>
、<img>
或其他标签的 URL
,来显示它们的内容。
3-1.BlobURL
BlobURL
的基本形式为 blob:<origin>/<uuid>
。
例如:
blob:http://jsgoshu.cn/05c212a9-2e47-477c-91df-430425ab3075
我们可以通过 URL.createObjectURL
方法来创建 BlobURL
。
var buffer = new Uint8Array([72, 101, 108, 108, 111]).buffer
var blob = new Blob([buffer], { type: 'text/plain' })
var blobUrl = URL.createObjectURL(blob)
console.log(blobUrl)
BlobURL
是放在当前浏览器内存中的映射。
生成的 URL(即其链接)仅在当前文档打开的状态下才有效。
当关闭浏览器页面时 当前的 BlobUrl
将立即失效。
TIP
另外,由于 BlobURL
会占用浏览器内存,为了防止内存占用过多:
我们可以选择在适当的时机,调用 URL.revokeObjectURL
主动释放内存。
调用之后,BlobURL
也会立即失效。
该方式常用于 文件下载
。在 a
链接下载完文件之后,释放内存。
let link = document.createElement('a')
link.download = 'hello.txt'
let blob = new Blob(['Hello, world!'], {type: 'text/plain'})
link.href = URL.createObjectURL(blob)
link.click()
URL.revokeObjectURL(link.href)
3-2.DataURL
DataURL
的形式为 data:[<mediatype>][;base64],<data>
。
譬如:
data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7
我们可以利用 FileReader
的 readAsDataURL
方法将 blob
转化为 DataURL
:
var blob = new Blob(['Hello World'], { type: 'text/plain' })
var reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = function () {
console.log(this.result) // data:text/plain;base64,SGVsbG8gV29ybGQ=
}
reader.onerror = function () {
console.log(this.error)
}
TIP
DataURL
采用的是 base64
编码。
这种编码将二进制数据表示为一个由 0
到 64
的 ASCII
码组成的字符串,非常安全且可读。
而且相比于 BlobURL
,DataURL
是长期有效的。