我在字符串中有base64编码的二进制数据 .
var contentType = 'image/png';
var b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
我想创建一个包含此数据的 blob:
URL并将其显示给用户 .
var blob = new Blob(????, {type: contentType});
var blobUrl = URL.createObjectURL(blob);
window.location = blobUrl;
我还没弄清楚如何创建 Blob
.
在某些情况下,我可以通过使用 data:
来避免这种情况 .
var dataUrl = 'data:' + contentType + ';base64,' + b64Data;
window.location = dataUrl;
但是在大多数情况下, data:
URL非常大 .
如何在JavaScript中将base64字符串解码为 Blob
对象?
8 回答
优化(但不太可读)的实现:
对于所有浏览器支持,特别是在Android上 . 也许你可以添加这个
atob
函数将base64编码的字符串解码为一个新字符串,其中包含二进制数据的每个字节的字符 .每个字符的代码点(charCode)都是字节的值 . 我们可以使用
.charCodeAt
方法为字符串中的每个字符应用它来创建一个字节值数组 .您可以将此字节值数组转换为实际类型的字节数组,方法是将其传递给
Uint8Array
构造函数 .这反过来可以通过将其包装在一个数组中转换为
Blob
,并将其传递给Blob
构造函数 .上面的代码有效 . 但是,通过在较小的切片中处理
byteCharacters
而不是一次性处理,可以稍微改善性能 . 在我的粗略测试中,512字节似乎是一个很好的切片大小 . 这给了我们以下功能 .完整示例:
...或ES6:
无法避免在没有依赖项或库的情况下发布简约方法 .
它需要新的fetch API . Can I use it?
使用此方法,您还可以轻松获取arraybuffer,text和json
我对Jeremy的es6同步版进行了简单的性能测试 .
同步版本将阻止UI一段时间 .
对于图像数据,我发现使用
canvas.toBlob
(异步)更简单看这个例子:https://jsfiddle.net/pqhdce2L/
我注意到,在切换像jeremy建议的数据时,Internet Explorer 11变得异常缓慢 . 这适用于Chrome,但在将切片数据传递给Blob-Constructor时IE似乎有问题 . 在我的机器上,传递5 MB的数据会导致IE崩溃和内存消耗 . Chrome会立即创建blob .
运行此代码以进行比较:
所以我决定在一个函数中包含jeremy描述的两种方法 . 积分是为了这个 .
如果你可以为你的项目添加一个依赖项,那就是提供方便的
base64StringToBlob
功能的blob-util npm package . 添加到package.json
后,您可以像这样使用它: