Esta pergunta já tem uma resposta aqui:
Ocasionalmente, ao fazer o download de um arquivo em um navegador da Web, o progresso do download não "sabe" o tamanho total do arquivo ou a duração do download - apenas mostra a velocidade na qual está sendo baixado, com um total como "Desconhecido".
Por que o navegador não saberia o tamanho final de alguns arquivos? Onde ela obtém essas informações em primeiro lugar?
Respostas:
Para solicitar documentos de servidores da Web, os navegadores usam o protocolo HTTP. Você pode conhecer esse nome na barra de endereços (ele pode estar oculto agora, mas quando você clica na barra de endereços, copia a URL e cola-a em algum editor de texto, você verá
http://
no início). HTTP é um protocolo simples baseado em texto. Funciona assim:Primeiro, seu navegador se conecta ao servidor do site e envia uma URL do documento que deseja baixar (as páginas da web também são documentos) e alguns detalhes sobre o próprio navegador ( User-Agent etc). Por exemplo, para carregar a página principal no site SuperUser
http://superuser.com/
, meu navegador envia uma solicitação com a seguinte aparência:A primeira linha especifica qual documento o servidor deve retornar. As outras linhas são chamadas de cabeçalhos; eles ficam assim:
Essas linhas enviam informações adicionais que ajudam o servidor a decidir o que fazer.
Se tudo estiver bem, o servidor responderá enviando o documento solicitado. A resposta começa com uma mensagem de status, seguida por alguns cabeçalhos (com detalhes sobre o documento) e, finalmente, se tudo estiver bem, o conteúdo do documento. É assim que a resposta do servidor SuperUser para minha solicitação se parece:
Após a última linha, o servidor do SuperUser fecha a conexão.
A primeira linha (
HTTP/1.1 200 OK
) contém o código de resposta , neste caso é200 OK
. Isso significa que o servidor decidiu que pode retornar um documento, conforme solicitado, e promete que o conteúdo a seguir será esse documento. Se não for esse o caso, o código será outra coisa e fornecerá alguma indicação do motivo pelo qual o servidor não está apenas retornando um documento como resposta: por exemplo, se não conseguir encontrar o documento solicitado, ele deverá retornar404 Not Found
, e se você não tiver permissão para acessar o conteúdo em questão, ele deverá retornar403 Forbidden
.Após essa primeira linha de status, os cabeçalhos de resposta seguem; eles fornecem mais informações sobre o conteúdo que está sendo retornado, como o dele
Content-type
.Em seguida é uma linha vazia. Isso indica que não haverá mais cabeçalhos de resposta. Tudo além dessa linha é o conteúdo do documento solicitado. Portanto, no exemplo acima,
<!DOCTYPE html>
é a primeira linha da página inicial do Superusuário (um documento HTML). Se eu estivesse solicitando o download de um documento, provavelmente haveria alguns caracteres sem sentido, porque a maioria dos formatos de documento é ilegível sem processamento prévio.Voltar aos cabeçalhos. O mais interessante para nós é o último
Content-Length
,. Ele informa ao navegador quantos bytes de dados ele deve esperar após a linha vazia, portanto, basicamente, é o tamanho do documento expresso em bytes. Este cabeçalho não é obrigatório e pode ser omitido pelo servidor. Às vezes, o tamanho do documento não pode ser previsto (por exemplo, quando o documento é gerado rapidamente), às vezes os programadores preguiçosos não o incluem (bastante comum nos sites de download de drivers), às vezes os sites são criados por iniciantes que não sabem de tal cabeçalho.De qualquer forma, seja qual for o motivo, o cabeçalho pode estar ausente. Nesse caso, o navegador não sabe quantos dados o servidor enviará e, portanto, exibe o tamanho do documento como desconhecido , aguardando o servidor fechar a conexão. E essa é a razão para tamanhos de documentos desconhecidos.
fonte
O
Content-Length
cabeçalho HTTP é opcional em alguns casos e, como tal, pode não ser transmitido com o arquivo; o final do arquivo será sinalizado quando o soquete for fechado.fonte
Content-Length
campo do cabeçalho for usado ou o documento for transferidoTransfer-Encoding: chunked
. O último permite gerar conteúdo dinamicamente e enviá-lo por partes à medida que é gerado e é capaz de sinalizar o final do documento.Quando o conteúdo (por exemplo, um
.pdf
documento ou uma planilha do Excel) é criado em tempo real, o tamanho não pode ser conhecido antes. Nesse caso, o servidor não pode enviar o tamanho do download antes e o navegador não pode exibir o tamanho total.fonte
.pdf
arquivos em tempo real. Contanto que os dados não sejam escritos de forma competitiva, você não sabe o tamanho, mas pode enviar o ata já para o navegador. Eu já fiz isso em Java e enviei um arquivo do Excel para o navegador que, como gerado em tempo real. Do lado dos navegadores, parecia um download, mas do lado dos servidores, é um streaming. Portanto, é possível transmitir.pdf
arquivos, mesmo que você não possa imaginar isso. No navegador, parece um download sem tamanho conhecido..pdf
arquivo ou uma planilha do Excel!