Für das folgende Thema gehe ich nur auf die wichtigen Dinge ein, da es vom Grundprinzip heraus ein sehr weitläufiges Thema ist und ich hier nicht auf jede Einzelheit eingehen möchte um das eigentliche Thema nicht zu zerreden.
Um Dateien auf den Server 'hochladen' zu können bedarf es natürlich eines Formulars. Ihr kennt das bereits aus Benutzersicht: Für Avatare, Bilder, Dokumente, etc.
Diese Formulare bedürfen jedoch einiger Besonderheiten, diese sollen hier eben aufgeführt werden.
Es wäre zu erst folgendes zu nennen:
enctype="multipart/form-data", sieht kryptisch aus, ist es auch, soll es auch sein. Damit wird einerseits dem Browser mitgeteilt, dass er nun konkret auch Dateien übertragen soll, und eben nicht nur Daten. Auch dem Server wird nun mitgeteilt, dass er nun nicht nur normale Daten bekommt, sondern jetzt bestimmte Sub-Routinen/Unterprogramme starten muss (vereinfacht ausgedrückt).
Diese Angabe muß im einleitenden Form-Tag aufgeführt werden, so dass dieser zum Beispiel wie folgt aussehen kann:
|
Source code
|
1
|
<form action="zielDateiname.php" method="post" enctype="multipart/form-data">
|
Ich empfehle bei Formularen grundsätzlich die POST-Methode zu wählen, und dieses auch in den PHP-Scripten dann auch mittels Abfragen der Daten ausschließlich mit
$_POST konsequent auszuführen. Dies ist nur eine, aber wichtige, Möglichkeit, um fremde und störende, bzw zerstörende, Einflüsse auf die Scripte und Daten auf dem eigenem Webspace zu verhindern. Es sollten zusätzliche Kontrollmechanismen ausgeführt werden um der Sicherheit zu ihrem Stand zu verhelfen.
Doch Schluss mit dem Geschwafel und weiter im Thema. Um Dateien mittels Formular versenden zu können, bedarf es natürlich dieses eine spezielle Formularfeldes mit dem
Durchsuchen-Button. Dieses wird wie folgt eingebunden:
|
Source code
|
1
|
<input class="input" type="file" name="datei">
|
Es sei hierzu vermerkt, dass man als weitere Argumente/Attribute noch die maximale Dateilänge (Größe in Byte) angeben kann, sowie natürlich die Länge des Feldes in der Darstellung - wie bei allen anderen also auch:
|
Source code
|
1
|
<input class="input" type="file" name="datei" maxlength="100000" accept="text/*" size="20">
|
Zu beachten ist jedoch, dass die Angabe
maxlength zu letzt im HTML 3.2 deklariert wurde. Ab HTML 4.0 wird sie nicht mehr aufgeführt. Ob die Browser sie also umsetzen, ist mit Vorsicht zu genießen. Es sollte zur Sicherheit auch Script seitig geprüft werden, wie groß die übertragende Datei ist, bevor sie gespeichert wird.
Die Angabe
accept="text/*" bezieht sich auf die
MIME-Typen. In der genannten Darstellung wird zusätzlich mit dem Wildcardzeichen
* gearbeitet um
alle Text basierten Datei-Typen zuzulassen. Dazu zählen also zum Beispiel auch
.txt und
.html.
So, dieses zum Browser seitigen Thementeil, kommen wir nun zum eigentlichen: dem PHP-Teil.
Wie läuft das ab, so ein Upload nach dem Bedienen des Sende-Buttons? Der Server nimmt erstmal wie gehabt alle Daten auf. Aber die übertragene Datei wird erstmal in den Temp-Bereich des Servers zwischen gespeichert. Sie lagert während der Laufzeit des Scriptes. Ist das Script beendet, für das sie gedacht ist, wird diese temporäre Datei wieder gelöscht und steht nicht mehr zur Verfügung.
Um diese temporäre Datei nun in den Webspace-Bereich zu verschieben/kopieren, bedarf der folgenden Funktion:
|
PHP Source code
|
1
|
$result=move_uploaded_file($_FILES['datei']['tmp_name'],"./eventuellerordner/".$_FILES['datei']['name']);
|
$result: Als Endresultat gibt
move_upload_file() die Ergebniskennung
true/1 für erfolgreich und
false/0 für
nicht erfolgreich aus. Diese Ausgabe kann man einer Variable/einem Array zuordnen. In obigen Fall der Variablen
$result.
['datei'] bezieht sich hierbei auf den Schlüssel des Formularfeldes, welcher mit
name="datei" deklariert wurde. Anstatt
datei kann also auch
honigkuchenpferd, oder
password/t, oder
benutzername, etc, stehen. Wichtig ist halt wie bei normalen Formularanwendungen auch, dass die Angaben im Formular mit den Pendants im PHP-Script übereinstimmen.
['tmp_name'] bezieht sich hier auf den Dateinamen der temporären Datei, welche nur für die Laufzeit des Scriptes zwischengespeichert wurde - sie ist also noch nicht am eigentlichen Zielort gespeichert!
['name'] bezieht sich hierbei auf den eigentlichen Dateinamen der Datei, wie ihn auch die Quelldatei auf der heimischen Festplatte zu lesen ist.
,"./eventuellerordner/".$_FILES['datei']['name']"); ist im zweiten Teil der PHP eigenen Funktion zu finden und bezeichnet den Ort, an dem die hoch geladene Datei abzuspeichern ist. Dabei ist das Verzeichnis der aufrufenden/verarbeitenden PHP-Datei das Ausgangsort zu verstehen. Es kann an genau dieser Stelle im Script der hoch geladenen Datei folgerichtig direkt ein neuer Name zugewiesen werden. ACHTUNG: eventuelle Unterordner müssen schon existieren, bzw müssen zuvor mit
mkdir(); angelegt werden!
Bevor die Datei gespeichert wird, sollte grundsätzlich geprüft werden, ob die Datei den gewünschten maximal Maßen entspricht. Bedeutet Dateigröße in Byte und bei Bildern auch Breite und Höhe, sowie grundsätzlich ob die übertragene Datei vom Dateityp her den Forderungen entspricht. Dies bezüglich stellt PHP eine umfangreiche Funktionsbibliothek bereit. Näheres dazu zum Beispiel auf
www.php.de und
www.selfphp.de
Zur wichtigen Besonderheit im PHP seitigem Teil dieses Themas sei auf
$_FILES hingewiesen. Während alle anderen Daten von Formularen mit
$_GET,
$_POST, bzw.
$_REQUEST eingefangen und verarbeitet werden können, können die Datei-bezogenen Daten einer hoch geladenen Datei nur mit
$_FILES eingefangen/verarbeitet werden!
This post has been edited 5 times, last edit by "-Der-Sucher-" (Dec 11th 2008, 3:15pm)