Cette question a déjà une réponse ici:
Parfois, lors du téléchargement d’un fichier dans un navigateur Web, la progression du téléchargement ne "connaît" pas la taille totale du fichier, ni sa progression dans le téléchargement. Elle indique simplement la vitesse à laquelle il est téléchargé, avec une total comme "Inconnu".
Pourquoi le navigateur ne connaît-il pas la taille finale de certains fichiers? Où trouve-t-il cette information en premier lieu?
Réponses:
Pour demander des documents à des serveurs Web, les navigateurs utilisent le protocole HTTP. Vous pouvez connaître ce nom dans votre barre d’adresse (il est peut-être masqué maintenant, mais lorsque vous cliquez sur la barre d’adresse, copiez l’URL et collez-la dans un éditeur de texte, vous verrez
http://
au début). HTTP est un protocole texte simple. Cela fonctionne comme ceci:Tout d'abord, votre navigateur se connecte au serveur du site Web et envoie l'URL du document qu'il souhaite télécharger (les pages Web sont également des documents) et quelques détails sur le navigateur lui - même ( User-Agent, etc.). Par exemple, pour charger la page principale sur le site SuperUser
http://superuser.com/
, mon navigateur envoie une demande qui ressemble à ceci:La première ligne spécifie le document que le serveur doit renvoyer. Les autres lignes sont appelées en-têtes; ils ressemblent à ceci:
Ces lignes envoient des informations supplémentaires qui aident le serveur à décider quoi faire.
Si tout va bien, le serveur répondra en envoyant le document demandé. La réponse commence par un message d'état, suivi de quelques en-têtes (avec des détails sur le document) et enfin, si tout va bien, du contenu du document. Voici à quoi ressemble la réponse du serveur SuperUser à ma requête:
Après la dernière ligne, le serveur de SuperUser ferme la connexion.
La première ligne (
HTTP/1.1 200 OK
) contient le code de réponse , dans ce cas c'est200 OK
. Cela signifie que le serveur a décidé qu'il peut retourner un document, comme demandé, et promet que le contenu qui va suivre sera un tel document. Si ce n'est pas le cas, le code sera autre chose et donnera une indication de la raison pour laquelle le serveur ne renvoie pas simplement un document en réponse: par exemple, s'il ne peut pas trouver le document demandé, il est supposé renvoyer404 Not Found
et si vous n'êtes pas autorisé à accéder au contenu en question, celui-ci est censé être renvoyé403 Forbidden
.Après cette première ligne d’état, les en-têtes de réponse suivent; ils fournissent plus d'informations sur le contenu renvoyé, tel que son
Content-type
.Suivant est une ligne vide. Cela indique qu'il n'y aura plus d'en-têtes de réponse. Tout ce qui est au-delà de cette ligne correspond au contenu du document demandé. Ainsi, dans l'exemple ci-dessus, se
<!DOCTYPE html>
trouve la première ligne de la page d'accueil de SuperUser (un document HTML). Si je demandais un document à télécharger, il s'agirait probablement de caractères charabia, car la plupart des formats de document sont illisibles sans traitement préalable.Retour aux en-têtes. Le plus intéressant pour nous est le dernier,
Content-Length
. Il indique au navigateur le nombre d'octets de données auxquels il doit s'attendre après la ligne vide. Il s'agit donc en gros de la taille du document exprimée en octets. Cet en-tête n'est pas obligatoire et peut être omis par le serveur. Parfois, la taille du document est imprévisible (par exemple, lorsque le document est généré à la volée), parfois les programmeurs fainéants ne l'incluent pas (assez commun sur les sites de téléchargement de pilotes), parfois les sites Web sont créés par des débutants qui ne savent pas d'un tel en-tête.Quoi qu'il en soit, quelle qu'en soit la raison, l'en-tête peut être manquant. Dans ce cas, le navigateur ne sait pas combien de données le serveur va envoyer et affiche donc la taille du document comme inconnue , attendant que le serveur ferme la connexion. Et c'est la raison pour laquelle la taille des documents est inconnue.
la source
L'en-
Content-Length
tête HTTP est facultatif dans certains cas et, en tant que tel, il peut ne pas être transmis avec le fichier. la fin du fichier sera signalée lorsque le socket sera fermé.la source
Content-Length
champ d’en-tête est utilisé ou si le document est transféréTransfer-Encoding: chunked
. Ce dernier permet de générer dynamiquement un contenu et de l’envoyer par morceaux au fur et à mesure de sa génération et de signaler la fin du document.Lorsque le contenu (par exemple un
.pdf
document ou une feuille Excel) est créé à la volée, la taille ne peut pas être connue auparavant. Dans ce cas, le serveur ne peut pas vous envoyer la taille du téléchargement auparavant et le navigateur ne peut pas afficher la taille totale.la source
.pdf
fichiers à la volée. Tant que les données ne sont pas écrites de manière compétitive, vous ne connaissez pas la taille, mais vous pouvez déjà envoyer les données au navigateur. Je l'ai déjà fait en Java et envoyé un fichier Excel au navigateur qui est généré à la volée. Du côté des navigateurs, cela ressemblait à un téléchargement, mais du côté des serveurs, il s’agissait d’une diffusion en continu. Il est donc possible de diffuser des.pdf
fichiers même si vous ne pouvez pas imaginer cela. Depuis le navigateur, cela ressemble à un téléchargement sans durée connue..pdf
fichier ou une feuille Excel!