angular - 如何在 Angular 中通过 HTTP 检索二进制数据?

标签 angular http blob

我正在使用 Cordova 编写 Angular/TypeScript 应用程序,需要从服务器下载二进制文件。

基于 another question ,我发现我需要在请求参数上设置适当的响应类型,以防止 Angular 尝试将响应主体解释为 JSON(这会导致崩溃,因为它是二进制数据)。

该问题的答案和 docs 将我指向 BlobArrayBuffer 作为可能的值。

不幸的是,我找不到任何关于这两者之间区别的解释(不,the respective question 并没有真正启发我),并且都以自己的方式失败。

数组缓冲区

当使用它时,我的应用程序崩溃并返回 RangeError,因为超出了 Angular1 内部深处的某个最大堆栈大小。

Blob

有了这个,请求通过了,但除非我遗漏了什么,否则调试器会显示我只得到一个具有 blob 大小和 MIME 类型的小对象,但实际的二进制数据丢失了!

此外,answer on the aforementioned question 指向一个 TextDecoder 来“解码结果”。

我不能以某种方式将二进制响应主体作为字节数组获取吗?


1:我实际上必须扩展这个由另一个(我或多或少无法访问)团队启动的应用程序,该团队的成员围绕 Angular 的 Http 添加了多层包装和参数/结果转换服务不会让事情更容易调试,但我非常有信心我已将断点设置在最底层,因此不会受到包装器的任何影响。

最佳答案

要以字节数组形式访问 blob,请使用 FileReader:

//use slice if your blob is too big
var chunkBlob = blobObject.slice(offset, chunk_size);

var fileReader = new FileReader();
fileReader.onload = function() {
    var byteArray = new Uint8Array(this.result);
}
fileReader.readAsArrayBuffer(chunkBlob);

至于 Blob 和 ArrayBuffer 之间的区别,您对 blob 对象无能为力。相比之下,ArrayBuffer 可以通过 DataViewTypedArrayTextDecoder 同步访问。 ArrayBuffer 是 ECMAScript 的一部分,但 Blob 不是。

From mozilla.org:

A Blob object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format.

关于angular - 如何在 Angular 中通过 HTTP 检索二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47080062/

相关文章:

javascript - Angular Material 对话框 - AGM 贴图

angular - 将 map 对象(具有动态键和值)渲染为 Angular 垫表(列和行作为 map 的键和值)

database - 如何在数据库 : BLOB or ARRAY? 中存储向量

python - 连接终止了 Azure 容器

java - 使用 Hibernate 获取 BLOB LAZY 的最佳方法

angular - 在 Angular 6 中将默认值设置为 formArray

maven - 如何从 angular 2 (angular-cli) 项目制作 WAR 文件?

php - Apache 服务器抛出 500 内部服务器错误

sockets - 通过闭合连接确定主体长度如何可靠(RFC 2616 4.4.5)

php - laravel file_get_contents ('php://input')不工作