template

Index :: PHP/MySQL :: Upload

Ein Upload besteht aus insgesamt 3 Phasen:
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:

HTML: Formular zur Auswahl der lokalen Datei

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.

PHP: Skript zur Prüfung und Verarbeitung

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&ouml;&szlig;er als 2 Mb.";
} else if ($size > 2097152) {
  $msg = "ist gr&ouml;&szlig;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&uuml;ltige Extension";

Index :: PHP/MySQL


template