PHP Fortschrittsbalken bei einem PHP-Datei-Upload (pecl uploadprogress)
Problematik
möchte man eine grosse Datei via html-form mit PHP hochladen, weiss man nie so recht wie lange es noch dauert, und oder wie viel denn hochgeladen wurde.
Lösung "fancy php upload"
Seit php5.2 gibt es ein PECL-Modul namens uploadprogress
Installation
pecl install uploadprogress
Wenn Du einen Fehler wie
sh: phpize: command not found
erhälst dann bitte
apt-get install php5-dev
ausführen
php.ini anpassen
/etc/php5/apache2/php.ini
suche nach ; Dynamic Extensions ; und füge in diesem Abschnitt
extension=uploadprogress.so
ein. Nun den Webserver neustarten.
Handhabung
Erstelle eine Seite mit einem uploadform. In dem Form MÜSSEN folgende Tags enthalten sein:
<input type="hidden" name="UPLOAD_IDENTIFIER" value="eindeutigerkey"> <input name="upload" type="file">
BEACHTE: type file MUSS den namen upload haben!!
Das abrufen des Prozesses erfolgt über die funktion
uploadprogress_get_info("eindeutigerkey");
Hier ein vollfunktionierendes Beispiel
Donload index.php
Dieses Beispiel läuft komplett OHNE Java oder dergleichen. Es werden lediglich 2 Iframes angelegt. Eines für den Status des uploads via php das andere für das Upload-Form. Der Refresh für das rechte Iframe (Info-Frame) ist auf 5 Sekunden eingestellt, evtl. sollte man den refresh hochsetzen. Dieses Beispiel ist komplett! Die Datei wird dann unter dem Originalnamen unter /tmp/ abgelegt!
Der Quelltext für den Infobereich / Upload status (rechte Frame).
$arr_status=uploadprogress_get_info($ID); $btotal=0.001; $buploaded=0; $saverage=0; $rsec=0; if(is_array($arr_status)){ $btotal=$arr_status['bytes_total']; $buploaded=$arr_status['bytes_uploaded']; $saverage=$arr_status['speed_average']; $rsec=$arr_status['est_sec']; } $prozent = round($buploaded / ($btotal / 100),2); $px=300*($prozent/100); echo '<div style="width: 300px;height:30px;border:solid 1px #000;"> <div style="background-color: #cc0000;height:30px;width: '.$px.'px;"></div></div> <table border=0><tr><td>Totalsize</td><td>: '.round($btotal,0).' bytes</td></tr> <tr><td>uploaded</td><td>: '.$prozent.' %</td></tr> <tr><td>uploaded</td><td>: '.$buploaded.' bytes</td></tr> <tr><td>speed</td><td>: '.$saverage.' bytes/sec</td></tr> <tr><td>remaining time</td><td>: '.$rsec.' sec.</td></tr></table>';
Getestet mit:
- Chrome
- FireFox
- Internet Explorer
- Opera