XHR读取二进制数据的部分响应,可行吗?

9

我正在研究使用二进制数据读取部分XHR响应的可能性。我们目前的方法是基于'responseText'属性和base64编码。显然,这远非最佳选择。

我们如何使用XHR读取部分Blob/ArrayBuffer响应呢?当我在Chrome中尝试时,仅当readyState = 4时整个ArrayBuffer/Blob才可用,而在此之前不可用。

总结一下,我认为:

  • 读取XHR的responseText属性:可以在readyState = 4之前读取响应,并将base64编码的二进制数据流回客户端
  • 使用responseType = 'arraybuffer'读取XHR的response属性:无法读取部分响应,但在readyState = 4时整个缓冲区都可用

我有什么遗漏吗?我们该采取什么方法来读取部分二进制响应?

3个回答

5

谢谢!看起来这就是做法。作为额外的好处,在我们的情况下,我们可以轻松地使用标准的XHR请求来支持不支持的浏览器。 - bjornl

5
有一种方法,虽然它还不是标准。Firefox允许您在XHR上设置responseType为"moz-blob"、"moz-chunked-text"或"moz-chunked-arraybuffer",具体取决于哪个适合您。然后,当您监听progress事件时,您将能够访问部分数据。MDN在此处此处有更多信息。

Chrome将支持流API,但目前还未准备好。Firefox可能也会最终支持它。我在某个地方读到IE已经支持了,尽管我似乎找不到任何官方文件来证实这一点。


谢谢回复。我们已经实现了流/分块机制。它基于base64编码和responseType=text,因为这似乎是当今最广泛支持的解决方案。 - bjornl
可能会改变我们的方法,更多地依赖于二进制多路复用的WebSocket通信,根据专有协议分块。这些块必须相当小且具有可预测的大小,以允许有效的多路复用,但也要能够可靠地检测到断开连接。看起来现在是一个可行的选择。 - bjornl
是的,Websockets是另一个不错的选择,前提是你有相应的服务器支持。 - brianchirls

1

使用作为XHR替代的最佳API是fetch与readableStream。

这在这里解释: https://developers.google.com/web/fundamentals/primers/async-functions#example_streaming_a_response

Chrome已经支持它。Firefox实现了它,但目前必须手动激活(它将在未来版本中默认激活)。 在等待此激活时,Firefox使用非标准响应类型moz-chunked-arraybuffer实现XHR

https://www.npmjs.com/package/fetch-readablestream提供了实现这两种方法的API。它使用https://www.npmjs.com/package/web-streams-polyfill


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接