我正在使用IBindStatusCallback和URLOpenPullStream异步下载数据。我想在数据到达之前分配数据缓冲区。
有没有办法检索Stream大小或读取Stream标头,以便我可以分配一个具有适当大小的缓冲区?
答案 0 :(得分:0)
如果幸运的话,IBindStatusCallback::OnProgress
将被调用,ulProgressMax
将为非零,并且实际上将正确表示数据的大小。
然而,在许多(可能是大多数)情况下,在下载整个响应之前,您无法知道总大小。这有两个原因:
服务器不会报告Content-Length:
标头,而是使用分块编码。事先没有关于最终响应有多大的信息。
服务器会报告Content-Length:
标头,但也使用gzip
压缩或类似方法。 Content-Length:
报告压缩数据的大小,以及您在ulProgressMax
中获得的内容。但UrlMon会自动解压缩并向您报告实际的解压缩数据,因此ulProgressMax
会过低。同样,在整个事情到来之前,没有关于(未压缩)响应的最终大小的信息。