Diese Frage hat hier bereits eine Antwort:
Gelegentlich "kennt" der Download-Fortschritt beim Herunterladen einer Datei in einem Webbrowser nicht die Gesamtgröße der Datei oder wie weit der Download fortgeschritten ist - er zeigt lediglich die Geschwindigkeit an, mit der die Datei heruntergeladen wird Insgesamt als "Unbekannt".
Warum konnte der Browser die endgültige Größe einiger Dateien nicht ermitteln? Woher bekommt es diese Informationen überhaupt?
Antworten:
Um Dokumente von Webservern anzufordern, verwenden Browser das HTTP-Protokoll. Möglicherweise kennen Sie diesen Namen aus Ihrer Adressleiste (möglicherweise ist er jetzt ausgeblendet. Wenn Sie jedoch auf die Adressleiste klicken, die URL kopieren und in einen Texteditor einfügen, wird dies
http://
am Anfang angezeigt ). HTTP ist ein einfaches textbasiertes Protokoll. Das funktioniert so:Zunächst stellt Ihr Browser eine Verbindung zum Server der Website her und sendet eine URL des herunterzuladenden Dokuments (auch Webseiten sind Dokumente) sowie einige Details zum Browser selbst ( User-Agent usw.). Um beispielsweise die Hauptseite auf der SuperUser-Site zu laden
http://superuser.com/
, sendet mein Browser eine Anfrage, die folgendermaßen aussieht:Die erste Zeile gibt an, welches Dokument der Server zurückgeben soll. Die anderen Zeilen heißen Überschriften; sie sehen so aus:
Diese Zeilen senden zusätzliche Informationen, anhand derer der Server entscheiden kann, was zu tun ist.
Wenn alles in Ordnung ist, sendet der Server das angeforderte Dokument. Die Antwort beginnt mit einer Statusmeldung, gefolgt von einigen Kopfzeilen (mit Details zum Dokument) und schließlich, wenn alles in Ordnung ist, dem Inhalt des Dokuments. So sieht die Antwort des SuperUser-Servers auf meine Anfrage aus:
Nach der letzten Zeile schließt der SuperUser-Server die Verbindung.
Die erste Zeile (
HTTP/1.1 200 OK
) enthält den Antwortcode , in diesem Fall ist es200 OK
. Dies bedeutet, dass der Server entschieden hat, dass er ein Dokument wie angefordert zurückgeben kann, und verspricht, dass der folgende Inhalt ein solches Dokument sein wird. Ist dies nicht der Fall, handelt es sich bei dem Code um einen anderen Code, und er gibt einen Hinweis darauf, warum der Server ein Dokument nicht nur als Antwort zurückgibt. Wenn er beispielsweise das angeforderte Dokument nicht findet, soll er es zurückgeben404 Not Found
, und wenn Sie nicht auf den fraglichen Inhalt zugreifen dürfen, soll er zurückkehren403 Forbidden
.Nach dieser ersten Statuszeile folgen die Antwortheader. Sie bieten weitere Informationen zum zurückgegebenen Inhalt, z
Content-type
.Weiter ist eine leere Zeile. Es signalisiert, dass keine Antwortheader mehr folgen. Alles, was über diese Zeile hinausgeht, ist der Inhalt des angeforderten Dokuments. Im obigen Beispiel
<!DOCTYPE html>
ist dies die erste Zeile der SuperUser-Homepage (ein HTML-Dokument). Wenn ich ein Dokument zum Herunterladen anfordere, handelt es sich wahrscheinlich um einige Kauderwelschzeichen, da die meisten Dokumentformate ohne vorherige Verarbeitung nicht lesbar sind.Zurück zu den Überschriften. Das interessanteste für uns ist das letzte
Content-Length
. Es teilt dem Browser mit, wie viele Datenbytes nach der Leerzeile erwartet werden sollen. Im Grunde genommen handelt es sich also um die in Bytes ausgedrückte Dokumentgröße. Dieser Header ist nicht obligatorisch und kann vom Server weggelassen werden. Manchmal kann die Dokumentgröße nicht vorhergesagt werden (zum Beispiel, wenn das Dokument im laufenden Betrieb erstellt wird), manchmal wird es von faulen Programmierern nicht berücksichtigt (was bei Websites zum Herunterladen von Treibern häufig vorkommt), manchmal werden Websites von Neulingen erstellt, die es nicht wissen von einem solchen Header.Egal aus welchem Grund, der Header kann fehlen. In diesem Fall weiß der Browser nicht, wie viele Daten der Server senden wird, und zeigt daher die Dokumentgröße als unbekannt an , während er darauf wartet, dass der Server die Verbindung schließt. Und das ist der Grund für unbekannte Dokumentengrößen.
quelle
Der HTTP-
Content-Length
Header ist in einigen Fällen optional und kann daher möglicherweise nicht mit der Datei übertragen werden. Das Ende der Datei wird signalisiert, wenn der Socket geschlossen wird.quelle
Content-Length
Headerfeld verwendet oder das Dokument mit übertragen wirdTransfer-Encoding: chunked
. Letzteres ermöglicht es, Inhalte dynamisch zu generieren und stückweise zu senden, wenn sie generiert werden, und das Ende des Dokuments zu signalisieren.Wenn der Inhalt (z. B. ein
.pdf
Dokument oder eine Excel-Tabelle) im Handumdrehen erstellt wird, kann die Größe vorher nicht bekannt sein. In diesem Fall kann der Server Ihnen die Größe des Downloads nicht vorher senden und der Browser kann die Gesamtgröße nicht anzeigen.quelle
.pdf
Dateien im laufenden Betrieb erstellen . Solange die Daten nicht vollständig geschrieben sind, kennen Sie die Größe nicht, aber Sie können den ata bereits an den Browser senden. Ich habe dies bereits in Java getan und eine Excel-Datei an den Browser gesendet, die im laufenden Betrieb generiert wurde. Von der Browserseite sah es wie ein Download aus, aber von der Serverseite ist es ein Streaming. So ist es möglich, Dateien zu streamen.pdf
, auch wenn Sie sich das nicht vorstellen können. Aus dem Browser sieht es aus wie ein Download ohne bekannte Länge..pdf
Datei oder einer Excel- Tabelle sein kann !