Blob
2025年1月10日大约 2 分钟
概述
由一个可选的字符串
type(通常是 MIME 类型)和blobParts组成的一系列其他Blob对象,字符串和BufferSource
blobParts是Blob/BufferSource/String类型的值的 数组options可选对象:type:Blob类型,通常是 MIME 类型,例如image/png,endings:是否转换换行符,使Blob对应于当前操作系统的换行符(\r\n或\n)。默认为"transparent"(啥也不做),不过也可以是"native"(转换)。
// 从字符串创建 Blob
let blob1 = new Blob(["ABCDEFG"], {
type: 'text/html'
})
blob1.text().then(res => {
console.log(res)
})
// 从类型化数组(typed array)和字符串创建 Blob
let hello = new Uint8Array([72, 101, 108, 108, 111]); // 二进制格式的 "hello"
let blob2 = new Blob([hello, ' ', 'world'], {
type: 'text/plain'
});
blob2.text().then(res => {
console.log(res)
})可以使用
clice方法来提取Blob,无法直接在Blob中更改数据,但可以通过slice获得Blob的多个部分,从这些部分创建新的Blob对象,将它们组成新的Blob
blob.slice([byteStart], [byteEnd], [contentType]);byteStart:起始字节,默认为 0byteEnd:最后一个字节(专有,默认为最后)contentType:新 blob 的type,默认与源 blob 相同
Blob 用作 URL
URL.createObjectURL(blob): 生成的 URL 存储了一个 URL →Blob映射。因此,此类 URL 很短,但可以访问Blob- 生成样式:
blob:http://localhost/3c532c62-832b-4023-9a56-5d8ff17bf805
- 生成样式:
URL.revokeObjectURL(url):从内部映射中移除引用,因此允许Blob被删除(如果没有其他引用的话),并释放内存- 如果介意内存,我们需要撤销(revoke)它们
- 直接访问
Blob,无需“编码/解码”
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);Blob 转 Base64
data-url的形式为data:[<mediatype>][;base64],<data>
- 图片生成样式:
<img src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7"> - 无需撤销(revoke)任何操作
- 对大的
Blob进行编码时,性能和内存会有损耗。
let link = document.createElement('a');
link.download = 'hello.txt'
let blob = new Blob(['Hello, world!'], {
type: 'text/plain'
})
let reader = new FileReader()
reader.readAsDataURL(blob) // 将 Blob 转换为 base64 并调用 onload
reader.onload = function() {
console.log(reader.result)
link.href = reader.result // data url
link.click()
}图片 转 Blob
// 获取任何图像
let img = document.querySelector('img');
// 生成同尺寸的 <canvas>
let canvas = document.createElement('canvas');
canvas.width = img.clientWidth;
canvas.height = img.clientHeight;
let context = canvas.getContext('2d');
// 向其中复制图像(此方法允许剪裁图像)
context.drawImage(img, 0, 0);
// 可以进行一些操作,比如旋转 context.rotate(),并在 canvas 上做很多其他事情
// toBlob 是异步操作,结束后会调用 callback
canvas.toBlob(function(blob) {
// blob 创建完成,下载它
let link = document.createElement('a');
link.download = 'example.png';
link.href = URL.createObjectURL(blob);
link.click();
// 删除内部 blob 引用,这样浏览器可以从内存中将其清除
URL.revokeObjectURL(link.href);
}, 'image/png');
// async/await 方式
// let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));