URLOpenPullStream -如何获取流大小

URLOpenPullStream - How to get the stream size

本文关键字:获取 何获取 URLOpenPullStream      更新时间:2023-10-16

我使用IBindStatusCallback和URLOpenPullStream异步下载数据。我想在数据到达之前分配数据缓冲区。

是否有一种方法来检索流的大小或读取流头,这样我就可以分配一个缓冲区与适当的大小?

如果幸运的话,将调用IBindStatusCallback::OnProgress, ulProgressMax将是非零的,并且将正确地表示数据的大小。

然而,在许多(也许是大多数)情况下,在下载整个响应之前,您无法知道总大小。这有两个原因:
  1. 服务器不报告Content-Length:头,而是使用分块编码。对于最终的响应有多大,根本没有预先的信息。

  2. 服务器不报告Content-Length:头,但也使用gzip压缩或类似的。Content-Length:报告压缩数据的大小,这就是你将在ulProgressMax中得到的。但是UrlMon会自动解压缩并向您报告实际解压缩的数据,因此ulProgressMax会太低。同样,在整个响应到达之前,没有关于(未压缩)响应的最终大小的信息。