Fileupload Progress mit PHP (simpel)

Manchmal wünscht man sich, man könnte den Upload von Dateien überwachen. Normalerweise ist das so: man wählt im Formular eine Datei aus und wartet, bis sie irgendwann hochgeladen ist. Es wäre natürlich schön, wenn man während des Uploads ein Feedback hätte – wie viel bereits hochgeladen wurde, wie schnell etc.
PHP kann das von sich aus nicht, aber nach einiger Recherche bin ich auf diese Seite gestoßen: http://php5.bluga.net/UploadProgressMeter/demo.php. Dort wird ein PECL Package benutzt, das eine Funktion zur Verfügung stellt, um den Uploadvorgang zu überwachen. Das Package gibt es hier: http://pecl.php.net/package/uploadprogress.
Das Beispiel funktioniert auf der Seite wunderbar, man kann sich es zwar herunterladen, aber da fehlt der komplette AJAX-Server und zur Verdeutlichung ist es ein wenig wie mit Kanonen auf Spatzen schießen. Daher habe ich ein eigenes kleines Beispiel gebaut, das alle nötigen Elemente enthält und erstmal ohne AJAX funktioniert. Vielleicht kommt ein AJAX-Bespiel mal dazu.
Aufbau: upload.php enthält ein Formular und zwei iFrames – in das obere wird die Datei geladen, im unteren zeigt man den Status an. Das Zielframe ist sinnvoll, damit die Seite sich nicht aufhängt und nicht neugeladen werden muss. Im Progressframe ist eine Datei, die den Status abfragt und sich jede Minute aktualisiert. Wichtig im Formular folgende Felder: UPLOAD_IDENTIFIER ist eine Id, über die der Upload abgefragt werden kann, ein Input-Feld vom Type file (logisch) und ein Button. Nicht vergessen im Formular method und enctype zu setzen, target ist das iFrame.

// upload.php Auszug
<body>
<iframe src="" name="upload_target"></iframe>
<br />
<iframe src="progress.php" name="upload_progress"></iframe>
<br />
<form action="result.php" method="post" method="post" enctype="multipart/form-data" target="upload_target">
	<input type="hidden" name="UPLOAD_IDENTIFIER" value="123456789" />
	<input type="file" name="upload_file" />
	<input type="submit" name="submit_file" value="upload file" />
</form>
</body>
// progress.php Auszug
<meta http-equiv="refresh" content="1; URL=progress.php">
// ...
$uid = '123456789';
if(function_exists('uploadprogress_get_info')) {
	$progress = uploadprogress_get_info($uid);
	print_r($progress);
}
// result.php Auszug
$uid = '123456789';
print_r($_POST);
print_r($_FILES);

Den Krams drumrum selber denken (html, head, body, php Einleitungstags etc.) Beispiel hier mach ich nicht – mein Speicherplatz ist begrenzt 😉

1 Kommentar