Fehlerbehandlung
Deshalb muss das Skript sie in den gewünschten Ordner verschieben. Das erledigt Version 2 unseres Skriptes, die zugleich auch eine einfache Fehlerbehandlung enthält.
In Zeile 13 des Skriptes wird das error_reporting eingeschaltet, was das Debugging erleichtert. Dann definieren wir die Variable $maxsize (Zeile 16), über die wir später die Größe der hochladbaren Dateien begrenzen können. Die Variable $upload_dir (Zeile 19) zeigt auf das Unterverzeichnis uploads des Ordners, in dem das Upload-Skript liegt.
Diesen Ordner müssen Sie auf dem Server anlegen und dem Webserver den Schreibzugriff erlauben. Das Skript funktioniert nur mit relativen Pfadangaben.
Als Nächstes überprüfen wir, ob das Formular schon abgeschickt oder die Webseite abgerufen wurde (Zeile 22). Im ersten Fall wird der Fehlercode in der Variable $uploaded_file['error'] abgelegt und anschließend verarbeitet:
Ist kein Fehler aufgetreten, speichert das Skript die temporäre Datei im Verzeichnis $upload_dir ab. Dazu nutzen wir die PHP-Funktion move_uploaded_file, die für solche Transfers sicherheitstechnisch optimiert wurde:
29: $dateiname = $uploaded_fi le ['name']; 30: // Kein Fehler: verschieben 31: move_uploaded_fi le($uploaded_ fi le['tmp_name'],$upload_dir . $dateiname); 32: echo "<p><a href='" . $upload_dir . $dateiname . "'>Datei ansehen</a></p>";
In Zeile 32 erzeugt das Skript einen Link, über den der Benutzer die Datei ansehen und wieder herunterladen kann.
Dateigrößenbeschränkungen
Der Umgang mit Dateien unter Beachtung von Größenbeschränkungen ist eine der wesentlichen Aufgaben des Upload-Skriptes. Leider bietet PHP keine Möglichkeit, die Dateigröße vor dem vollständigen Upload zu checken. Das führt dazu, dass Nutzer eine Datei mit gewissem Zeitaufwand hochladen, um anschließend festzustellen, dass der Server sie wegen ihrer Größe abweist.
Um die Zahl solcher Usability-Unfälle zu minimieren, zeigen wir die maximale Dateigröße in Version 3 unseres Skriptes im Upload-Formular an. Dazu vergleichen wir in den Zeilen 31 bis 36 die verschiedenen Größenbeschränkungen, die für Uploads greifen. Seitens der PHP-Konfiguration (php.ini) sind das upload_max_ filesize und post_max_size.

© Archiv
Außerdem haben wir selbst die Variable $maxsize eingeführt. Das Skript ermittelt den kleinsten der drei Werte und speichert diesen in der Variable $maxsize ab. Das bedeutet: Selbst wenn in Zeile 16 $maxsize fälschlich größer definiert wird als es die von der php.ini vorgegebenen Parameter erlauben, passt das Skript die Variable automatisch nach unten an.
Außerdem müssen Sie das Skript nicht angleichen, wenn Sie es auf unterschiedlich konfigurierten Servern einsetzen. Vielmehr erscheint die korrekte maximale Dateigröße automatisch im Upload-Formular.
Am Rande: Die Funktion BinarySuffixKiller wandelt Größenangaben der php.ini ("G" für Gigabyte, "M" für Megabyte und "K" für Kilobyte) korrekt um und lässt sich auch in anderen Projekten wiederverwenden.
Erweitererte Fehlerbehandlung
Die rudimentäre Fehlerbehandlung aus Version 2 haben wir in Version 3 erweitert:
43: if ($uploaded_fi le['error'] == 1){ 44: echo "<h1>Fehler: Datei zu gross</h1>"; 45: }elseif($uploaded_file['error'] == 3){ 46: echo "<h1>Fehler: Datei unvollstaendig</ h1>"; 47: }elseif($uploaded_file['error'] == 4){ 48: echo "<h1>Fehler: Datei wurde nicht übermittelt</h1>"; 49: }elseif($uploaded_file['size'] > $maxsize){ 50: echo "<h1>Fehler: Datei zu gross</h1>";