Datei Upload

Das fünfzigste PHP Tutorial muss einfach von mir sein ^^
Dieses Tutorial setzt voraus, dass man Ahnung im Umgang mit PHP und Formularen hat! Im Endeffekt passiert beim senden einer Datei nichts weltbewegendes. Anstatt das halt nur der $_POST oder $_GET Array übermittelt wird, wird durch das deklarieren des enctype Auch noch ein $_FILES Array übermittelt, der wies sonst auch der $_POST und $_GET Array nun halt keine gewöhnlichen Variabeln beinhaltet, sondern Angaben zur Datei.
Folgende Datei beinhaltet ein Formular welches das Senden einer Datei zulässt, und darunter ein winziges Stück PHP-Code, welches die print_r Funktion aufruft, die uns dann detailliert darstellt, was wir mit dem Array $_FILES nun übermittelt haben. Probiert es ruhig mal aus. (Das pre macht hier das es mir schön untereinander aufgeschlichtet wird - hat die Funktion HTML-Code exakt darzustellen, also nicht umzusetzen)
<form enctype="multipart/form-data" method="POST" action="">
<input type="file" name="datei">
<input type="submit">
</form>

<?
echo'<pre>';
print_r($_FILES);
echo'</pre>';
?>

Bei mir sieht das Ergebnis so aus:

Array
(
[datei] => Array
(
[name] => bild.jpg
[type] => image/pjpeg
[tmp_name] => C:WINDOWSTEMPphpB4.tmp
[error] => 0
[size] => 11162
)

)


Wie man schnell erkennt, hat PHP die Datei die ich hoch geladen habe in den Temp Ordner geladen. Wie dieser heißt teilt mir wie versprochen die $_FILES Funktion mit. Will ich das hoch geladene Bild also verwenden, brauch ich es lediglich so zu verschieben und umzubenennen wie ich will.
Besonders wichtig für die Überprüfung der Datei sind die weitere Angaben wie Dateigröße (size), Dateityp (type) und wers halt braucht, der ursprüngliche Name, der aber auf dem Server wie man am tmp_name sieht nicht viel zusagen hat, weil PHP meiner Datei bereits einen eigenen Namen zugeteilt hat.
Schön sieht man auch das meine Datei ein untergeordneter Array ist, ich kann also so viele Dateien gleichzeitig hoch laden lassen wie ich will, muss halt nur jedem Upload-Feld einen anderen Namen geben.
Will ich jetzt also auf meine Datei zugreifen, muss ich den $_FILES Array aufrufen. Darin muss ich jetzt den Array meines Upload-Feldes anwählen, das ich, wie man oben im Formular sieht "datei" genannt habe. Jetzt suche ich also den Array namens datei. Folglich finde ich über $_FILES[datei] zu den Daten meines Uploads. Eigentlich wie bei all den anderen Formularen nur das es jetzt halt nicht $_POST und $_GET heißt sondern halt $_FILES - Kein Drama.
Will ich meine Datei nun verschieben, brauch ich bloß die Funktion copy() zu verwenden. Diese verlangt nur zwei Angaben (Hurra!), nämlich den Ursprung und das Ziel der Datei. Mitunter kann ich die Datei auch gleich umbenennen, weil das Ziel ja sowieso neu erstellt wird und ob das jetzt den alten oder einen völlig neuen Dateinamen hat ist PHP vollkommen Hugo.
Sagen wir ich will die Datei jetzt direkt auf C: spielen und in Upload.jpg umtaufen. Dann brauch ich nur folgendes machen:
copy($_FILES[datei][tmp_name],'C:Upload.jpg');
Fertig. Ich muss nicht einmal absolute Pfade angeben. Ich kann das wie sonst im Internet einfach von der PHP-Datei aus angeben, also zum Beispiel so: "../../avatare/Upload.jpg". Die Handhabung läuft wie bei ganz normalen Formularen.
Ist das nicht voll prima?
Die DAteigröße überprüft man ganz einfach indem man eine if erzeugt, in der die Dateigröße einem Verhältnis unterzogen wird. Will ich also auf keinen Fall, dass eine datei über 25kb liegt sieht das so aus:
if($_FILES[datei][size] < 25000)
{
die('Datei größer als 25kb - Pfuscher!');
}

Man kann Bilddateien über eine eigene Funktion noch viel genauer unter die Lupe nehmen: getimagesize(). Die ermittelt einem Breite, Höhe, und Bildtyp. Leider funktioniert die nur bei Bilddateien, wir haben - ihr habt es sicher schon bemerkt - hier aber eine .tmp Datei. Man muss die Datei also bereits in den Zielordner kopieren, dort überprüfen und notfalls auch von dort wieder heraus löschen. das geht ganz einfach mit der Funktion unlink() oder ihrem synonym delete().
Meine Überprüfung wäre jetzt also GetImageSize('C:Upload.jpg'); Was die Funktion ausspuckt sieht so aus:
Array
(
[0] => 400 // Width
[1] => 242 // Height
[2] => 2 // Typ (1 = GIF, 2 = JPG, 3 = PNG, SWF = 4)
[3] => width="400" height="242" // Höhe und Breite als HTML Tag
[bits] => 8 //Farbtiefe
[channels] => 3 //Farbkanäle
[mime] => image/jpeg //Typizierung
)

Dazu sag ich jetzt nichts mehr, denn wie man einen Array verwertet sollte jeder der soweit ist das er das bauen will ganz einfach wissen^^
Viel Spaß

Kommentare

Pharmazo
Pharmazo am Montag, 25. Oktober 2004 um 18:56

fine werds mal ausprobieren!

Blade.hes
Blade.hes am Dienstag, 1. März 2005 um 02:30

nice Tut kann ich gut gebrauchen ;)

Sammy23
Sammy23 am Freitag, 8. Juli 2005 um 01:49

Schön schön genau das was ich gesucht habe :)