Ist es möglich, den Fortschritt einer XMLHttpRequest abzurufen (Bytes hochgeladen, Bytes heruntergeladen)?
Dies ist nützlich, um einen Fortschrittsbalken anzuzeigen, wenn der Benutzer eine große Datei hochlädt. Die Standard-API scheint dies nicht zu unterstützen, aber vielleicht gibt es in einem der Browser eine nicht standardmäßige Erweiterung? Es scheint doch eine ziemlich offensichtliche Funktion zu sein, da der Client weiß, wie viele Bytes hochgeladen / heruntergeladen wurden.
Hinweis: Mir ist die Alternative "Server auf Fortschritt abfragen" bekannt (genau das mache ich gerade). Das Hauptproblem dabei (abgesehen von dem komplizierten serverseitigen Code) besteht darin, dass beim Hochladen einer großen Datei die Verbindung des Benutzers normalerweise vollständig unterbrochen wird, da die meisten ISPs einen schlechten Upstream bieten. Zusätzliche Anfragen zu stellen ist also nicht so reaktionsschnell wie ich gehofft hatte. Ich hatte gehofft, dass es einen Weg geben würde (vielleicht nicht zum Standard), um diese Informationen zu erhalten, über die der Browser jederzeit verfügt.
quelle
Firefox unterstützt XHR-Download-Fortschrittsereignisse .
quelle
Einer der vielversprechendsten Ansätze scheint darin zu bestehen, einen zweiten Kommunikationskanal zurück zum Server zu öffnen, um ihn zu fragen, wie viel der Übertragung abgeschlossen wurde.
quelle
Firefox 3.5 unterstützt das Upload-Fortschrittsereignis
quelle
Für die insgesamt hochgeladene Version scheint es keine Möglichkeit zu geben, damit umzugehen, aber es gibt etwas Ähnliches wie das, was Sie zum Herunterladen wünschen. Sobald readyState 3 ist, können Sie responseText regelmäßig abfragen, um den gesamten Inhalt bis zu einem String herunterzuladen (dies funktioniert im IE nicht), bis alles verfügbar ist. Zu diesem Zeitpunkt wechselt er zu readyState 4. Die Summe Zu einem bestimmten Zeitpunkt heruntergeladene Bytes entsprechen der Gesamtzahl der Bytes in der in responseText gespeicherten Zeichenfolge.
Für einen Alles-oder-Nichts-Ansatz für die Upload-Frage sind die für readyState 0 und 1 gesendeten Gesamtbytes 0 und die Summe für readyState 0, da Sie eine Zeichenfolge zum Hochladen übergeben müssen (und es ist möglich, die Gesamtbytes davon zu bestimmen) 2 ist die Gesamtzahl der Bytes in der Zeichenfolge, die Sie übergeben haben. Die Gesamtzahl der in readyState 3 und 4 gesendeten und empfangenen Bytes ist die Summe der Bytes in der ursprünglichen Zeichenfolge plus der Gesamtzahl der Bytes in responseText.
quelle
quelle
Wenn Sie Zugriff auf Ihre Apache-Installation haben und Code von Drittanbietern vertrauen, können Sie das Fortschrittsmodul für den Apache-Upload verwenden (wenn Sie Apache verwenden, gibt es auch eine Fortschrittsmodul für den Nginx-Upload ).
Andernfalls müssten Sie ein Skript schreiben, das Sie außerhalb des Bandes aufrufen können, um den Status der Datei anzufordern (z. B. die Dateigröße der tmp-Datei überprüfen).
In Firefox 3 wird derzeit daran gearbeitet, dem Browser Unterstützung für den Upload-Fortschritt hinzuzufügen, aber das wird nicht in alle Browser gelangen und für eine Weile weit verbreitet sein (mehr schade).
quelle
Die einzige Möglichkeit, dies mit reinem Javascript zu tun, besteht darin, eine Art Abfragemechanismus zu implementieren. Sie müssen Ajax-Anforderungen in festen Intervallen (z. B. alle 5 Sekunden) senden, um die Anzahl der vom Server empfangenen Bytes abzurufen.
Ein effizienterer Weg wäre die Verwendung von Flash. Die Flex-Komponente FileReference löst regelmäßig ein Fortschrittsereignis aus, das die Anzahl der bereits hochgeladenen Bytes enthält. Wenn Sie sich an Javascript halten müssen, stehen Brücken zwischen Actionscript und Javascript zur Verfügung. Die gute Nachricht ist, dass diese Arbeit bereits für Sie erledigt wurde :)
swfupload
Diese Bibliothek ermöglicht die Registrierung eines Javascript-Handlers für das Flash-Fortschrittsereignis.
Diese Lösung hat den Vorteil, dass auf der Serverseite keine zusätzlichen Ressourcen erforderlich sind.
quelle