URLOpenPullStream - Как получить размер потока

0

Я использую IBindStatusCallback и URLOpenPullStream для загрузки данных асинхронно. Я хотел бы выделить буфер данных до поступления данных.

Есть ли способ получить размер потока или прочитать заголовок Stream, чтобы я мог выделить буфер с соответствующим размером?

Теги:
url
download

1 ответ

0

Если вам повезет, IBindStatusCallback::OnProgress, ulProgressMax будет отличным от нуля и будет фактически правильно представлять размер данных.

Однако во многих (возможно, большинстве) случаях вы не можете узнать общий размер, пока не загрузите весь ответ. Для этого есть две причины:

  1. Сервер не сообщает заголовок Content-Length: но вместо этого использует закодированную кодировку. Просто нет информации о том, насколько велика будет реакция.

  2. Сервер сообщает заголовок Content-Length: но также использует сжатие gzip или подобное. Content-Length: сообщает размер сжатых данных и то, что вы получите в ulProgressMax. Но UrlMon автоматически распаковывает и отправляет вам фактические данные для декомпрессии, поэтому ulProgressMax будет слишком низким. Здесь снова нет информации о возможном размере (несжатого) ответа до тех пор, пока все это не прибудет.

  • 0
    Ах. Понимаю. Поэтому моя лучшая стратегия - использовать ulProgressMax, если он доступен, и распределять его так много, но не предполагайте, что это фактический максимум, и будьте готовы выделять больше по мере необходимости. Благодарю.
  • 0
    Или просто игнорируйте ulProgressMax и будьте готовы выделять больше по мере необходимости. Нет причин для реализации двух разных стратегий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню