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

Console
sh: phpize: command not found

erhälst dann bitte

root
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

tiki download file

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