template
Ein Upload besteht aus insgesamt 3 Phasen:
- Dateiauswahl
Hierfür wird ein Formular mit einem INPUT-Element vom Typ file verwendet. Hinter Feldern dieses Typs fügt der Browser automatisch einen Button ein, mit dem der Benutzer einen Dateiauswahl-Dialog öffnen kann.
- Transfer
Auf den Datentransfer selbst haben wir keinen Einfluss; er wird selbsttätig zwischen Browser und Server durchgeführt.
- Speicherung
Sie unterliegt wieder unserer Kontrolle: die empfangene temporäre Datei wird an ihren Bestimmungsort auf Platte oder in eine Datenbank geschrieben.
Wir benötigen letztendlich also 2 Codeblöcke, die in der Praxis oft in einem Skript zusammengefasst werden.
Der Übersichtlichkeit halber setzen wir die Blöcke hier jedoch in separate Skripte:
Bei einem Upload-Formular müssen gewisse Punkte beachtet werden:
Verwendung des FORM-Attributs enctype mit dem Wert multipart/form-data.
Verwendung eines INPUT-Feldes vom Typ file.
Optionale Angabe der maximalen Dateigröße (hier: 2 Mb) im INPUT-Attribut maxlength. Dies wird jedoch von den wenigsten Browsern ausgewertet.
Ein simples Beispiel:
<form action='upget.php' method='post' enctype='multipart/form-data'>
<input type='file' name='srcfile' size='64' maxlength='2097152'><br>
<input type='submit' value='Senden'>
</form>
Das empfangende Skript (
upget.php) kann danach über den Namen srcfile auf die hochgeladenen Daten zugreifen.
Im Skript
upget.php, welches von obigem Formular nach erfolgtem Transfer aufgerufen wird, stehen im globalen Array $_FILES nun folgende Informationen bereit:
Element |
Bedeutung |
$_FILES['srcfile']['name'] |
Der ursprüngliche Dateiname auf dem Client. |
$_FILES['srcfile']['type'] |
Der Mime-Typ der Datei, falls der Browser diese Information zur Verfügung gestellt hat, beispielsweise "image/gif". |
$_FILES['srcfile']['size'] |
Die Größe der hochgeladenen Datei in Bytes. |
$_FILES['srcfile']['tmp_name'] |
Der temporäre Dateiname, unter dem die hochgeladene Datei auf dem Server gespeichert wurde. |
$_FILES['srcfile']['error'] |
Der Fehlercode im Zusammenhang mit dem Hochladen der Datei. |
Im Beispiel wird nach Prüfung der Größe versucht, die Datei unter ihrem Originalnamen im Ordner up zu speichern. Danach erfolgt die Ausgabe einer entsprechenden Meldung:
<?php
$msg = "";
if (!($size = intval(@filesize($tmpname = $_FILES['srcfile']['tmp_name'])))) {
$msg = "ist entweder leer oder größer als 2 Mb.";
} else if ($size > 2097152) {
$msg = "ist größer als 2 Mb.";
} else {
$dstfile = basename($_FILES['srcfile']['name']);
if (!@copy($tmpname, "up/". $dstfile)) $msg = "konnte nicht angelegt werden.";
}
if (strlen($msg)) @unlink($_FILES['srcfile']['tmp_name']);
else $msg = "wurde gespeichert";
echo "Datei ", $msg;
?>
Theoretisch könnte man auch noch die Extension prüfen, um z.B. nur Grafiken (JPG, GIF, PNG) zuzulassen:
$extok = array("JPG", "JPEG", "GIF", "PNG");
if ($ext = strrchr($_FILES['srcfile']['name'], ".")) {
$ext = in_array(strtoupper(substr($ext, 1)), $extok);
}
if (!$ext) echo "Datei hat keine gültige Extension";
template |
 |