Upload: Fortschrittsbalken anzeigen
Christian Wermelinger
- dhtml
Hallo
Ich habe in PHP ein Script geschrieben, womit sich Dateien auf einen FTP-Server laden lassen. Werden grösser Datenmengen transferiert, dauert es dementsprechend lange bis eine Bestätigung erscheint, dass die Datei erfolgreich upgeloaded wurde. Nun würde ich gerne in der Zwischenzeit den Upload-Status anzeigen (z.B. 33% sind bereits hochgeladen). Das Ganze sollte in etwa der Status-Bar des Internet-Explorers entsprechen. Gibt es dazu ein Script bzw. ist das überhaupt möglich (z.B. mit Javascript/DHTML) zu Laufzeit des Scripts (d.h. während die Daten per Submit-Button abgeschickt bzw. upgeloaded werden), denn aktuellen Status anzuzeigen? Für jeden Hinweis bin ich äusserst dankbar!
Gruss Chris
Hi,
Gibt es dazu ein Script bzw. ist das überhaupt möglich (z.B. mit Javascript/DHTML) zu Laufzeit des Scripts (d.h. während die Daten per Submit-Button abgeschickt bzw. upgeloaded werden), denn aktuellen Status anzuzeigen?
hast Du danach im Archiv gesucht?
Cheatah
Ja genau sowas meine ich. Ich habe mir dieses Script bereits angeschaut. Das Problem ist, dass es nicht funktioniert wenn ich ein FTP-Upload machen will bzw. per Submit-Button eine neue Datei aufrufe (was relativ lange dauert, da ja eben zuerst die Datei hochgeladen wird). Gibt es vielleicht irgend eine Lösung wie ich den Statusbalken (unten rechts im Internet Explorer) in mein Script integrieren, d.h. z.B in einem PopUp-Fenster anzeigen kann?
Hallo Chris,
Ja genau sowas meine ich. Ich habe mir dieses Script bereits angeschaut. Das Problem ist, dass es nicht funktioniert wenn ich ein FTP-Upload machen will bzw. per Submit-Button eine neue Datei aufrufe (was relativ lange dauert, da ja eben zuerst die Datei hochgeladen wird). Gibt es vielleicht irgend eine Lösung wie ich den Statusbalken (unten rechts im Internet Explorer) in mein Script integrieren, d.h. z.B in einem PopUp-Fenster anzeigen kann?
Das ist naturgemäß unmöglich, da das Script erst gestartet wird, wenn der Request beendet ist. Der Browser liest nach dem Absenden des Formulars die Dateien, kodiert sie und sendet dann den Request, was einige Zeit dauert. Nachdem diese Anfrage des Clients komplett gesendet wurde, macht sich der Webserver daran, die Antwort zu senden. Das bedeutet zunächst, dass er im lokalen Dateisystem das Script findet und den Script-Interpreter mit den jeweiligen Parametern startet (beziehungsweise das Webserver-Modul). Die POST-Anfragedaten werden dem Interpreter zur Verfügung gestellt, und beim Initialisieren des Interpreters werden diese Daten auch erst als Dateien in eine temporärer Verzeichnis gelegt, aus welchem sie dann vom Script kopiert werden können.
An keiner Stelle dieses Ablauf kann nachträglich clientseitig oder serverseitig ein Status des Requests gemessen werden - das heißt, der Browser könnte es, da er die Requestgröße kennt und anhand der momentanen Übertragungsgeschwindigkeit feststellen könnte, wie lange das Senden des Requests noch dauern wird. Aber die von dir angesprochene Status-Ladeleiste ist bei solchen Anwendungen in der Regel nutzlos, da nicht berechnet wird, wieviel Prozent des Requests schon gesendet wurden - zumindest habe ich diese Erfahrung mit MSIE gemacht, Mozilla zeigt auch für das Senden des Requests eine Fortschrittsleiste an, welche nach dem besagten Mechanismus zu rechnen scheint. Opera zählt die übertragenen Daten und zeigt die momentane Geschwindigkeit an, es wird auch explizit »Uploading file(s) to server« angezeigt, aber es wird nicht berechnet, wieviel Prozent vom Gesamtrequest schon gesendet wurden. Wie auch immer, du wirst diesen Mechanismus nicht mittels JavaScript oder einer serverseitigen Sprache nachbauen können, da es rein auf der HTTP-Ebene abläuft.
Wie das ASP-Script arbeitet, weiß ich nicht. Bei mir funktioniert es nicht. Vielleicht arbeitet es mit dem Webserver zusammen, welcher das Script schon startet, während der Körper des Requests noch gesendet wird. Oben habe ich beschrieben, wie es in PHP und meines Wissens auch in Perl funktioniert.
Grüße,
Mathias
Hi molily,
An keiner Stelle dieses Ablauf kann nachträglich clientseitig oder serverseitig ein Status
des Requests gemessen werden - das heißt, der Browser könnte es, da er die Requestgröße kennt
und anhand der momentanen Übertragungsgeschwindigkeit
woher soll der Browser diesen Wert kennen?
feststellen könnte, wie lange das Senden des Requests noch dauern wird.
Aber die von dir angesprochene Status-Ladeleiste ist bei solchen Anwendungen in der Regel
nutzlos, da nicht berechnet wird, wieviel Prozent des Requests schon gesendet wurden -
Eben. Wie soll er dann die Übertragungsgeschwindigkeit kennen, die sich als Quotient dieses
Wertes und der verstrichenen Zeit ausdrücken ließe?
Wie auch immer, du wirst diesen Mechanismus nicht mittels JavaScript oder einer serverseitigen
Sprache nachbauen können, da es rein auf der HTTP-Ebene abläuft.
... und vor allem da ein HTTP-Request aus Sicht jeglicher verwendbarer Intelligenz (server- wie clientseitig) eine unteilbare Einheit bildet. Der einzige, der diese Einheit in einzelne Schritte (Blöcke etc.) aufteilen könnte, wäre der Browser selbst.
Viele Grüße
Michael
Hier habe ich ein Beispiel wie ich mir das Ganze vorstelle. Das Problem ist nur, dass dieses Ding in ASP geschrieben ist. Gibt es vielleicht irgend eine Lösung mit PHP/JavaScript?
http://www.pstruh.cz/util/upload/old-upload.asp