На этот вопрос уже есть ответ здесь:
Иногда при загрузке файла в веб-браузер процесс загрузки не «знает» общий размер файла или его длительность - он просто показывает скорость его загрузки с Всего как «Неизвестно».
Почему браузер не знает окончательный размер некоторых файлов? Откуда он берет эту информацию в первую очередь?
Ответы:
Для запроса документов с веб-серверов браузеры используют протокол HTTP. Возможно, вы знаете это имя из адресной строки (оно может быть скрыто сейчас, но когда вы щелкнете по адресной строке, скопируете URL-адрес и вставите его в какой-нибудь текстовый редактор, вы увидите его
http://
в начале). HTTP - это простой текстовый протокол. Это работает так:Во-первых, ваш браузер подключается к серверу веб-сайта и отправляет URL-адрес документа, который он хочет загрузить (веб-страницы также являются документами), а также некоторые сведения о самом браузере ( User-Agent и т. Д.). Например, чтобы загрузить главную страницу на сайте SuperUser
http://superuser.com/
, мой браузер отправляет запрос, который выглядит следующим образом:Первая строка указывает, какой документ сервер должен вернуть. Другие строки называются заголовками; они выглядят так:
Эти строки отправляют дополнительную информацию, которая помогает серверу решить, что делать.
Если все хорошо, сервер ответит отправкой запрошенного документа. Ответ начинается с сообщения о состоянии, за которым следуют некоторые заголовки (с подробной информацией о документе) и, наконец, если все хорошо, содержимое документа. Вот как выглядит ответ сервера SuperUser на мой запрос:
После последней строки сервер SuperUser закрывает соединение.
Первая строка (
HTTP/1.1 200 OK
) содержит код ответа , в данном случае это200 OK
. Это означает, что сервер решил, что он может вернуть документ в соответствии с запросом, и обещает, что последующее содержимое будет таким документом. Если это не тот случай, код будет чем-то другим, и он предоставит некоторое указание причины, по которой сервер не просто возвращает документ в качестве ответа: например, если он не может найти запрошенный документ, он должен вернуть404 Not Found
и если вам не разрешен доступ к рассматриваемому контенту, он должен вернуться403 Forbidden
.После этой первой строки состояния следуют заголовки ответа; они предоставляют больше информации о возвращаемом контенте, например, его
Content-type
.Следующая пустая строка. Это сигнализирует о том, что больше не будет заголовков ответа. Все, что за этой строкой, является содержанием запрошенного документа. Таким образом, в приведенном выше примере
<!DOCTYPE html>
это первая строка домашней страницы SuperUser (HTML-документ). Если бы я запрашивал документ для загрузки, это, вероятно, были бы некоторые бессмысленные символы, потому что большинство форматов документов не читаются без предварительной обработки.Вернуться к заголовкам. Самый интересный для нас - последний
Content-Length
. Он сообщает браузеру, сколько байтов данных следует ожидать после пустой строки, поэтому в основном это размер документа, выраженный в байтах. Этот заголовок не является обязательным и может быть опущен сервером. Иногда размер документа не может быть предсказан (например, когда документ генерируется на лету), иногда ленивые программисты не включают его (довольно часто на сайтах загрузки драйверов), иногда сайты создаются новичками, которые не знают такого заголовка.В любом случае, какой бы ни была причина, заголовок может отсутствовать. В этом случае браузер не знает, сколько данных сервер собирается отправить, и поэтому отображает размер документа как неизвестный , ожидая, пока сервер закроет соединение. И это причина неизвестных размеров документов.
источник
Content-Length
Заголовок HTTP является необязательным в некоторых случаях и как таковой он может не передаваться вместе с файлом; конец файла будет сигнализироваться при закрытии сокета.источник
Content-Length
поле заголовка, либо документ переносится сTransfer-Encoding: chunked
. Последний позволяет динамически генерировать контент и отправлять его по кусочкам, когда он генерируется, и может сигнализировать об окончании документа.Когда содержимое (например,
.pdf
документ или лист Excel) создается на лету, размер не может быть известен раньше. В этом случае сервер не может отправить вам размер загрузки ранее, а браузер не может отобразить общий размер.источник
.pdf
файлы на лету. Пока данные записаны не полностью, вы не знаете их размера, но вы можете отправить ata уже в браузер. Я сделал это уже на Java и отправил файл Excel в браузер, который генерируется на лету. Со стороны браузеров это выглядело как загрузка, а со стороны серверов - потоковое. Таким образом, возможно потоковое воспроизведение.pdf
файлов, даже если вы не можете себе этого представить. Из браузера это выглядит как загрузка без известной длины..pdf
файла или листа Excel!