为什么不推荐readAsBinaryString()?来自W3C
readAsArrayBuffer()的使用优于readAsBinaryString(),后者是为了向后兼容性而提供的。
readAsBinaryString返回一个与另一个方法完全不同的东西,那么一个方法怎么能替代另一个方法呢?
在我的具体案例中,我有一个需要转换为base64的Blob,有很多种方法,但它们中的大多数都没有有效的内存。在我的测试中,从window.btoa的结果调用readAsBinaryString()效果最好。如果我不能再使用它(或者现在让我们说“应该”),那么我必须使用迭代和字符串连接将数组转换为字符串,这是内存效率不高的!
因此,在研究了几天之后,我并没有真正找到替代readAsBinaryString的方法,这就是为什么要问这个问题,还是您看到了一个同样适用于100‘t的blobs的替代方案?
发布于 2019-05-22 05:27:38
历史是,在readAsBinaryString
接口存在之前,FileReader已经出现在FileReader API的早期规范中。
当ArrayBuffer接口出现时,readAsBinaryString
已经被废弃了,因为它的所有用例都可以以更好的方式使用这个新接口。
实际上,readAsBinaryString
只将二进制数据转换为DOMString (UTF-16)。之后你就没什么办法了。另外,将其存储为UTF-16字符串意味着它比原始数据大小占用更多的内存空间。此外,字符串是不可变的,我想您可以从这一点看出工作效率有多低。
最后,如果您确实需要这个字符串,您实际上可以通过一个ArrayBuffer进行同样的操作,您只需要在这个ArrayBuffer的Uint8视图上调用String.fromCharCode
。
// generate some binary data
document.createElement('canvas').toBlob(blob => {
const bin_reader = new FileReader();
const arr_reader = new FileReader();
let done = 0;
bin_reader.onload = arr_reader.onload = e => {
if(++done===2) {
const arr_as_bin = [...new Uint8Array(arr_reader.result)]
.map(v => String.fromCharCode(v)).join('');
console.log('same results: ', arr_as_bin === bin_reader.result);
console.log(arr_as_bin);
}
}
bin_reader.readAsBinaryString(blob);
arr_reader.readAsArrayBuffer(blob);
});
现在,这个方法,虽然仍然是非常无用的,已经重新添加到规范,因为一些网站确实开始使用它。
为了给OP提供更多帮助,因为他们想要做的实际上是获得他们的Blob的base64版本,那么甚至不要使用readAsArrayBuffer()
,您需要的是readAsDataURL()
:
const blob = new Blob(['hello']);
const reader = new FileReader();
reader.onload = e => {
const dataURL = reader.result;
const base64 = dataURL.slice(dataURL.indexOf(',')+1);
console.log(base64);
};
reader.readAsDataURL(blob);
https://stackoverflow.com/questions/55836771
复制相似问题