phpBuddy

Webhosting Gutscheine

Auf der Suche nach einem top Provider? Dann lohnt ein Blick auf diesen Artikel - Gutscheine zum Geld sparen gibt's inklusive!

Sie sind hier: Startseite Formulare verarbeiten (Datei Upload)
Formulare und PHP - Teil 3 (Datei Upload)
Beitragsseiten
Formulare und PHP - Teil 3 (Datei Upload)
Hochgeladene Datei verarbeiten
Schlußwort und Linkübersicht
Alle Seiten

Wer sich durch Teil 1 und Teil 2 dieses Tutorials die Grundlagen angeeignet hat, erfährt nun im 3. Teil, wie man über ein Formular Dateien auf einen Server laden kann. Obwohl der eigentliche Hochlade-Prozess nur ein Ein-Zeiler ist, muß man doch einiges an Know-How mitbringen, damit es hier keine bösen Überraschungen gibt.

In diesem Teil lernen wir: Wie man überprüft ob überhaupt ein Upload stattfand; Ob es bei der Übertragung zu Fehler kam; Die Datei auf gültige Formate zu prüfen; Wie die Datei an ihren Bestimmungsort kommt; Dateirechte setzen, daß man die Datei auch wieder löschen kann.

Das Upload Formular

Schon der HTML-Teil eines Formulars für einen Datei Upload unterscheidet sich von einem "normalen" Formular das ausschließlich zum übertragen von Text-Informationen benutzt wird. Schauen wir uns zunächst einmal das HTML eines solchen Formulars an.

<html>
<head>
<title>Datei Upload</title>
</head>
 
<body>
<form name="DateiUpload" id="DateiUpload" method="post" action="" enctype="multipart/form-data">
    <input type="file" name="datei" id="datei" /><br />
    <input type="submit" name="submitbutton" id="submitbutton" value="Datei hochladen">
</form>
</body>
</html>

Der erste große Unterschied findet schon direkt im form-Tag statt. Sobald ein Formular eine Datei hochladen können soll, muß der enctype angegeben werden.

enctype="multipart/form-data"

Ohne diesen Zusatz kann man keine Dateien auf einen Server übertragen! Als Input-Type müssen wir "file" benutzen. Dies erzeugt ein Upload-Feld mit dem man automatisch über den "Durchsuchen"-Button die Festplatte nach der entsprechenden Datei durchsuchen kann. Das ist schon alles was seitens HTML nötig ist. Binden wir noch kurz die uns bekannte Ausgabe-Funktion im PHP-Teil ein und machen einen Testlauf. Das Script sieht nun wie folgt aus ...

<?php
if (isset( $_POST['submitbutton'] ))
{
    echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
?>
<html>
<head>
<title>Datei Upload</title>
</head>
 
<body>
<form name="DateiUpload" id="DateiUpload" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
    <input type="file" name="datei" id="datei"><br />
    <input type="submit" name="submitbutton" id="submitbutton" value="Datei hochladen">
</form>
</body>
</html>

Ein erster Aufruf im Browser, als Datei wähle ich testweise ein JPG Bild mit dem Name "sonnenblume.jpg" und klicke auf den Submitbutton. Hmm, irgend etwas scheint hier nicht zu stimmen, denn die Ausgabe sieht so aus:

Array
(
    [submitbutton] => Datei hochladen
)

Sollte hier nicht auch [datei] => "sonnenblume.jpg" stehen, so das wir über $_POST['datei'] auf unser Bild zugreifen können? Die Antwort ist: Nein!
Dateien die über ein Formular hochgeladen werden verfügen über ein eigenes, Superglobales Array, das auf den Namen $_FILES hört. Texteingaben und Datei Uploads werden also, obwohl über ein und daselbe Formular kommend, getrennt behandelt. Das ist auch gut so, denn das $_FILES Array hält viel mehr Informationen über eine hochgeladene Datei bereit mit der wir arbeiten können.
Ändern wir doch mal das ...

echo "<pre>" .print_r( $_POST, true ). "</pre>";

... ab in ein ...

echo "<pre>" .print_r( $_FILES, true ). "</pre>";

... und sehen was uns PHP mitzuteilen hat. Die Ausgabe sieht nun wie folgt aus:

Array
(
    [datei] => Array
        (
            [name] => sonnenblume.jpg
            [type] => image/jpeg
            [tmp_name] => C:\xampp\tmp\php6.tmp
            [error] => 0
            [size] => 112899
        )
 
)

Aha, das sieht doch schon besser aus. Hier sehen wir eine ganze Menge Info über unser hochgeladenes Bild. Das Superglobale Array $_FILES hält für uns verschieden Informationen bereit. Im einzelnen sind das:

  1. $_FILES['name'] - Der Dateiname der hochgeladenen Datei
  2. $_FILES['type'] - Der MIME Typ der Datei
  3. $_FILES['tmp_name'] - Der temporäre Name der Datei auf dem Server
  4. $_FILES['error'] - Der Fehlercode der Aufschluß über den Upload gibt, im einzelnen sind das:
    • 0 - Es liegt kein Fehler beim Upload vor
    • 1 - Die hochgeladene Datei ist größer als der maximal erlaubte Wert in der php.ini
    • 2 - Die hochgeladene Datei ist größer als der maximal erlaubte Wert der durch MAX_FILE_SIZE im Formular definiert wurde
    • 3 - Die Datei wurde nur teilweise hochgeladen
    • 4 - Es wurde keine Datei hochgeladen
  5. $_FILES['size'] - Die Dateigröße in Byte

Noch einmal zurück zum HTML-Teil. Wie im Error-Code 2 zu sehen ist, kann man mit MAX_FILE_SIZE eine maximal erlaubte Dateigröße vorgeben. Dies ist aber eher unzuverlässig und kann umgangen werden, deswegen habe ich es oben nicht in's HTML eingebaut. Der Vollständigkeit wegen möchte ich hier aber noch kurz zeigen wie man einen Wert festlegt.

<input type="hidden" name="MAX_FILE_SIZE" value="50000">

Der Wert wird durch ein verstecktes Feld (type="hidden") übergeben und das name-Attribut muß den Namen MAX_FILE_SIZE tragen. Zwischen Groß-/Kleinschrift wird hier unterschieden! Durch das value-Attribut wird die erlaubte Größe in Byte festgelegt, hier wären das ca. 50 KB. Wichtig ist hierbei noch, daß die MAX_FILE_SIZE vor dem eigentlichen Dateifeld festgelegt werden muß.

Richtig!
<input type="hidden" name="MAX_FILE_SIZE" value="50000">
<input type="file" name="datei" id="datei">
 
Falsch!
<input type="file" name="datei" id="datei">
<input type="hidden" name="MAX_FILE_SIZE" value="50000">

In Ordnung, damit sollten die Grundlagen für den Datei Upload geklärt sein. Schauen wir uns nun an wie wir mit PHP die hochgeladene Datei verarbeiten können.