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 |
|