聊聊浏览器的 Blob API
Blob
在浏览器中用于表示二进制类型的大对象, 典型的有图片、 音频或其他多媒体对象。
1 | const blob = new Blob(['hello world'], { |
通过 Blob
与其他 API 结合, 可以实现很多实用的功能, 我们先看看这些 API。
URL
URL
API 是一个用于创建 URLs 的对象:
1 | new URL('http://test.nail.com:8080/test?a=1&b=2#c') |
可以看到, 即使不了解这个 API, 我们仍旧会对返回的结果感觉比较熟悉。 URL
有如下静态方法:
URL.createObjectURL(Blob blob)
这是一个经常会和 Blob
一起使用的方法, 接收一个 Blob
对象作为参数, 返回一个 blob 链接(如 “blob:http://test.nail.com:8080/xxxxxxx")。
URL.revokeObject()
将通过 URL.createObjectURL()
创建的 blob 链接销毁。
FileReader
FileReader
API 赋予了我们在浏览器中异步读取本地文件的能力, 通过 Blob
或 File
对象指定要读取的文件或数据。
1 | const reader = new FileReader() |
FileReader.prototype.readAsXxx()
通过该方法可以读取指定 Blob
中的内容, 一旦完成, 在 onload
事件对象的 result
属性中, 将包含指定格式的数据对象:
readAsArrayBuffer()
: 读取结果是ArrayBuffer
数据对象类型readAsBinaryString()
: 读取结果是文件的原始二进制数据readAsDataURL()
: 读取结果是 Base64 字符串readAsText()
: 读取结果是文件内容的字符串形式
onload
事件
onload
事件在读取操作完成时触发, 是使用 FileReader
时最常涉及的。
File
说到 Blob
就顺带提一下 File
, File
API 基于 Blob
并且提供一些有关文件的信息。
一般而言, 用户在 <input>
元素上选择文件后, 返回的 FileList
对象就是由 File
对象组成的列表。
在了解这些 API 后, 就可以与 Blob
API 结合, 来实现一些有趣的功能了。
通过 Blob URL 隐藏真实链接
以图片为例:
1 | function getBlobByUrl(url) { |
通过该方式获取到图片链接对应的 Blob URL 后, 用户就无法获取图片实际的 URL 了, 对于 audio
, video
等资源也是同理。
上面代码中可以看到, 需要等待数据加载完后才可使用。 对于 video
这样比较大的资源, 那等待时间就会很长, 所以需要通过流媒体来解决问题。
生成 Data URLs
通过 Blob
配合 FileReader
可以将图片转换为 Data URLs 的形式:
1 | function readBlobAsDataURL(blob) { |
通过上面两种方式, 还可以实现在浏览器中预览本地图片的功能。