# Blob
# 1、Blob是什么
Blob 对象表示一个不可变、原始数据的类文件对象。
File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。(MDN)
# 2、使用方法
# (1)、创建实例
创建blob实例,new Blob(arr, options),arr是是一个由ArrayBuffer、 ArrayBufferView、 Blob、 DOMString 等对象构成的 Array。options为object,默认属性type和endings
let blob = new Blob(['blog'], {type: 'text/plain'});
1
# (2)、属性
- Blob.size:Blob 对象中所包含数据的字节大小
- Blob.type:MIME 类型,即为创建实例时options的type
# (3)、方法
- slice([start[, end[, contentType]]]):返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。
- stream():返回一个能读取 blob 内容的 ReadableStream。
- text():返回一个 Promise 对象且包含 blob 所有内容的 UTF-8 格式的 USVString。
- arrayBuffer():返回一个 Promise 对象且包含 blob 所有内容的二进制格式的 ArrayBuffer。
# 3、应用场景
# (1)、分片上传
// file对象继承blob对象
let blob = document.getElementById("file").files[0];
let chunkSize = 1000;
for (let start = 0; start < blob.size; start += chunkSize) {
// 对每片内容进行上传
let chunk = blob.slice(start, start + chunkSize + 1);
const fd = new FormData();
fd.append("data", chunk);
// 发送请求
ajax({
url,
data: fd
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# (2)、下载文件、地址隐藏
let link = document.createElement('a');
// 设置下载文件名
link.download = 'text.txt';
// 文件内容
let blob = new Blob(['这里是文件内容']);
// 链接以createObjectURL方式,避免显式暴露
link.href = window.URL.createObjectURL(blob);
// 模拟点击事件
link.click();
// 释放url,节约内存
URL.revokeObjectURL(link.href);
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# (3)、http请求数据存储到 Blob 对象
let xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
callback(xhr.response);
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9