Я сегодня что-то скачивал, и я знаю, что это всего 1,8 ГБ, но после загрузки 1,8/1,8 ГБ, произошло нечто странное. Chrome продолжал скачивать файл, и полоса прогресса начала показывать анимацию загрузки, а размер файла продолжал увеличиваться, пока, наконец, не остановился после 2,5 ГБ. Это был видеофайл, и там написано, что он весит 2,5 ГБ на моем диске, и он даже не воспроизводится. Как это происходит?
решение1
Одним из многочисленных заголовков ответа, входящих в протокол HTTP, является Content-Length
заголовок. По сути, он позволяет серверу сообщать клиенту, насколько велики данные, отправляемые в ответе. Chrome, как и большинство разумных браузеров, использует этот заголовок для определения того, что показывать для общего размера файла при загрузке файла, а также для вычисления отображаемого прогресса загрузки.
Однако здесь есть две проблемы:
- Серверы не обязаны отправлять этот заголовок (он нужен только в некоторых обстоятельствах, а не во всех). Редко можно увидеть, как серверы не отправляют его для вещей, которые являются реальными файлами на их локальном диске, но это не редкость, когда это контент, который генерируется динамически и отправляется по мере его генерации (например, архивы ZIP, генерируемые на лету некоторыми облачными службами хранения, чтобы позволить клиентам загружать группы файлов одновременно), попадают в эту категорию). Когда это происходит, Chrome отображает ход загрузки без фактического процента завершения, но обычную полосу загрузки, указывающую на то, что загрузка продолжается.
- По соображениям совместимости, в случаях, когда заголовок не требуется, но все равно отправляется, его следует рассматривать как рекомендательную информацию, а не как строгое указание размера ответа. Для этого существует слишком много причин, чтобы перечислять их здесь, но суть в том, что при извлечении (или загрузке) ресурса Chrome (и большинство браузеров) продолжают извлекать данные до тех пор, пока сервер не прекратит их отправлять в этих случаях, поскольку они не могут доверять точности того, что указано в заголовке (на самом деле, Chrome скроет незначительные расхождения между сообщенным размером файла и фактическим размером файла при загрузке
То, что произошло в вашем случае, было результатом этой второй проблемы. Когда он достиг «полного» размера файла и продолжил получать данные, Chrome в конечном итоге переключился на отображение вещей, как будто он не знает размер загружаемого файла. Две возможные причины, которые приходят на ум для этого, — это либо ошибка (либо на сервере, либо в какой-то промежуточной системе), либо вредоносная активность (вероятно, атака «человек посередине» или скомпрометированный сервер, если это ваш случай).
В любом случае, об этом, вероятно, следует сообщить владельцу сайта, с которого вы скачали видео, поскольку в любом случае для них это, скорее всего, будет плохой новостью.
Кстати, вы также можете увидеть похожее поведение, но без увеличения размера файла, если Chrome сможет извлечь весь файл из сети быстрее, чем запишет его на локальный диск.