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

时间:2017-11-02 16:21:45

标签: angular http blob

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

根据another question,我发现我需要在请求参数上设置一个合适的响应类型,以防止Angular尝试将响应体解释为JSON(这会导致崩溃,因为它& #39;二进制数据)。

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

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

ArrayBuffer

使用此功能时,由于在Angular 1 的内部深处超出了一些最大堆栈大小,我的应用程序崩溃了RangeError

斑点

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

除此之外,answer on the aforementioned question指出TextDecoder对解码结果""。

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

1 :我实际上必须扩展这个由另一个(或多或少不可访问的)团队开始的应用程序,其成员在Angular&#周围添加了几层包装和参数/结果转换39; s Http服务不会让事情变得更容易调试,但我相信我已经将断点设置在最底层,因此没有遇到包装器的任何影响。

1 个答案:

答案 0 :(得分:0)

要将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:

  

Blob对象表示不可变的原始数据的类文件对象。   Blob表示不一定是JavaScript本机的数据   格式。