PHP Fortschrittsbalken bei Uploads

Die Übertragung von Dateien von einem Client (z.B. Browser ) zu einem Server (z.B. Webserver ) ist fester Bestandteil heutiger Internet-Anwendungen. Durch die steigende Anzahl an Hochgeschwindigkeitsanschlüßen (z.B. DSL ) steigt auch die durchschnittliche Größe der Dateien an, die hochgeladen werden. Falls jedoch die Bandbreite des verwendeten Internet-Anschlusses nicht ausreichend hoch ist oder aber die zu übertragenden Dateien zu groß sind, möchte der Anwender gerne wissen, wieviel Prozent der Datei bereits übertragen wurde. Soweit die Internet-Anwendung die Verwendung von PHP erlaubt, kann hierbei die Erweiterung PHP Fortschrittsanzeige (engl. PHP upload progress) verwendet werden, die dem Benutzer anzeigt, wieviel Prozent einer hochzuladenden Datei bereits übertragen wurden. Die Erweiterung basiert auf den Arbeiten von Doru Petrescu und Christian Stocker und ist in der Programmiersprache C geschrieben.

Eine aktuelle Version von PHP Fortschrittsanzeige steht auf der zentralen Download-Seite zur Verfügung.

Dokumentation

Die Erweiterung stellt eine neue Funktion uploadprogress_get_info zur Verfügung, die innerhalb eines PHP Scripts verwendet werden kann. Diese Funktion erwartet als einzigen Parameter eine ID. Bei dieser ID handelt es sich um einen Schlüssel, der einen upload eindeutig identifiziert. Dieser Schlüssel muss für jeden Upload dynamisch generiert und in einem versteckten Feld hinterlegt werden. Der Name des versteckten Feldes kann über eine Einstellung in der Datei php.ini definiert werden. Das Formular könnte beispielsweise so aussehen.

<form action="/meine/url" enctype="multipart/form-data" method="post"> <input type="hidden" name="<?php echo ini_get( 'uploadprogress.upload_identifier' );?>" value="<?php rand() . time(); ?>" /> <input id="upload" name="upload" size="30" type="file" /> <input type="submit" value="Upload File" /></p> </form>

Nachdem ein solches Formular abgeschickt wurde, kann der Fortschritt des uploads mit Hilfe der Funktion uploadprogress_get_info überwacht werden. Dazu muss derselbe Wert, der in dem oben gezeigten Beispiel als "<?php rand() . time(); ?>" /> übermittelt wurde, an die Funktion übergeben werden. Um das zu bewerkstelligen gibt es mehrere Möglichkeiten, die an dieser Stelle nicht weiter erörtert werden sollen. In der Erweiterung ist ein Beispiel enthalten, das eine dieser Möglichkeiten demonstriert.

Die Funktion liefert ein Feld zurück. In diesem Feld sind die folgenden Informationen gespeichert.

Feldname Beschreibung
bytes_total Anzahl der Bytes die insgesamt hochgeladen werden sollen
bytes_uploaded Anzahl der Bytes doe bisher hochgeladen wurden
speed_average Durchschnittliche Geschwindigkeit mit der hochgeladen wird
est_sec Geschätze verbleibende Zeit bis der upload beendet wird
current_file Name der Datei die derzeit hochgeladen wird

Konfiguration

Die Erweiterung kann mit Hilfe einiger Parameter konfiguriert werden. Die Konfiguration kann in der Datei php.ini (oder in einer der durch sie eingebundenen Dateien) oder in der Konfiguration des Webservers erfolgen. Folgende Parameter werden in der aktuellen Version unterstützt.

Einstellung Typ Standardeinstellung Beschreibung
uploadprogress.filename_template Zeichenkette /tmp/upt_%s.txt Name der Datei in der die Upload-Informationen zwischengespeichert werden
uploadprogress.upload_identifier Zeichenkette UPLOAD_IDENTIFIER Name des versteckten input Feldes (in dem Formular für den Upload) dessen Wert den Upload eindeutig identifiziert
uploadprogress.update_interval Integer 500 Wert der angibt, wie oft der Fortschritt neu berechnet werden soll
uploadprogress.delete_finished Boolean 1 Wenn dieser Wert auf eins gesetzt ist, wird die temporäre Datei mit den Upload-Informationen gelöscht, nachdem der Upload beendet wurde.

Verweise

Als Ausgangspunkt für die Entwicklung der Erweiterung habe ich die folgenden bereits existierenden Lösungen verwendet und angepasst:

Kommentare

Sie müssen sich anmelden oder registrieren um einen Kommentar abgeben zu können.

eZ Publish™ copyright © 1999-2010 eZ Systems AS