FTP-Datei-Uploads mit PHP-Protokollen

(http://www.zdnet.de/magazin/39144469/ftp-datei-uploads-mit-php-protokollen.htm)

von Gastautor, 20. Juni 2006

In diesem kurzen Tutorial geht es um den Upload von Dateien über FTP, dabei wird das PHP-FTP-Protokoll für einen zweistufigen Upload verwendet: vom lokalen Speichermedium auf einen Webserver und von dort auf einen FTP-Server.

Unter PHP gibt es immer mehr als nur einen Weg, um ein bestimmtes Ziel zu erreichen. Das gilt auch für den Upload von Dateien. Natürlich ist es möglich den traditionellen Weg über einen HTTP-Datei-Upload zu beschreiten und die Datei direkt auf den Webserver zu schicken. Man kann sich aber auch zu einer etwas exotischeren Variante entschließen und den Upload mittels FTP-Protokoll in zwei Schritten durchführen: vom lokalen Speichermedium auf einen Webserver und von dort auf einen FTP-Server.

PHP unterstützt von Haus aus beide Upload-Verfahren, der Nutzer kann entscheiden, welches angesichts der Design-Anforderungen seiner Anwendung des bessere ist. Das Übertragen von Dateien mittels der FTP-Funktionen von PHP geht fast genauso vor sich, wie das Überspielen mit einem herkömmlichen FTP-Client - sogar die Bezeichnungen der Funktionen ähneln den bekannten FTP-Befehlen.

Es wurden schon ganze Abhandlungen über HTTP-Datei-Uploads geschrieben, deshalb geht es in dieser kurzen Anleitung stattdessen um Uploads per FTP (im folgenden Beispiel sind allerdings beide Verfahren enthalten). Die Anleitung setzt das Vorhandensein einer betriebsbereiten PHP/Apache-Installation voraus, bei der sowohl der HTTP-Datei-Upload als auch die FTP-Funktionen aktiviert sind. Feststellen, ob eine Zugangsberechtigung/Uploadberechtigung für den FTP-Server besteht

Die FTP-Funktionen von PHP arbeiten auf der Grundlage einer Client-Server-Verbindung. Man muss sich also zunächst auf dem FTP-Zielserver einloggen, bevor ein Upload von Dateien stattfinden kann. Zunächst einmal ist also sicherzustellen, dass man über die nötigen Zugangsberechtigungen für diese Aufgabe verfügt. Dieser Schritt mag ganz selbstverständlich erscheinen, man wäre jedoch erstaunt, wie viele Entwickler nicht daran denken und später Stunden mit der Fehlersuche zubringen.

Listing A

Sobald feststeht, dass die entsprechenden Zugangsberechtigungen vorliegen, kann man sich wieder ausloggen.

Schritt 2: Ein Upload-Formular erstellen

Als Nächstes schreibt man ein einfaches HTML-Formular, das beim Benutzer um entscheidende Angaben nachsucht: Zugangsdaten für den FTP-Server, das Server-Verzeichnis, in das der Upload erfolgen soll und den vollständigen Dateipfad sowie den Namen der hochzuladenden Datei. Hier ein Beispiel dafür (Listing B), wie ein solches Formular aussehen könnte:

Listing B

Hier wird das Element <input type=file...> als ein Dialogfenster dargestellt, in dem der Nutzer die hochzuladende Datei auswählen kann. Das Element <form enctype=...> zwingt die Formulardaten zur Übertragung im multipart-Format, was es PHP erleichtert, die Dateikomponente der übertragenen Daten zu identifizieren. Sobald das Formular an den Webserver gegangen ist, besteht der nächste (und letzte) Schritt darin, die FTP-Funktionen von PHP dazu zu verwenden, die Daten mittels der vom Nutzer eingegebenen Zugangsdaten auf den FTP-Zielserver zu übertragen. Hier das Script (upload.php), das diese Aufgabe übernimmt (Listing C):

Listing C

Dies mag zwar kompliziert wirken, ist jedoch eigentlich ganz einfach. Die Vorgänge laufen so ab:

  1. Sobald das Formular abgeschickt wird, werden die Zugangsdaten, die der Nutzer in die einzelnen Eingabefeldern eingetragen hat, in normalen PHP-Variablen gespeichert. Jetzt sind durch das spezielle $_FILES-Array von PHP auch Daten über die hochgeladene Datei verfügbar.
  2. Das $_FILES-Array besteht aus mehreren Sub-Arrays, für jede heruntergeladene Datei gibt es eines. Die Schlüsseldaten jedes Sub-Arrays enthalten Informationen über Größe, MIME-Typ, Ursprungsnamen und temporären Namen der entsprechenden Upload-Datei. Diese Informationen verwendet die Funktion move_uploaded_file() zur Übertragung der Datei aus dem Zwischenverzeichnis des Systems in das Arbeitsverzeichnis. Hier muss man daran denken, den Wert für $workDir zu ändern, damit dieser einem gültigen Dateipfad auf dem System entspricht.
  3. Die Funktionen ftp_connect() und ftp_login() werden verwendet, um eine Verbindung mit dem angegebenen FTP-Host aufzubauen und sich mit den bereitgestellten Zugangsdaten einzuwählen.
  4. Einen erfolgreichen Login vorausgesetzt, wird die Funktion ftp_put() verwendet, um die Datei aus dem Arbeitsverzeichnis in das vom Nutzer bezeichnete entfernte Verzeichnis zu übertragen und sie wieder mit ihrer ursprünglichen Bezeichnung zu versehen. Man beachte dabei, dass ftp_put() das spezielle FTP_BINARY-Argument hinzugefügt wurde, mit dem bestimmt wird, dass die Datei binär (und nicht im ASCII-Modus) übertragen wird. Abhängig vom Ergebniscode, den die Funktion ftp_put() zurückmeldet, wird dem Nutzer eine Fehler- oder eine Erfolgsmeldung angezeigt.
  5. Die Funktion ftp_close() dient dazu die FTP-Session zu beenden und die Funktion unlink() wird zum Aufräumen verwendet und löscht dazu die lokale Kopie der Datei, die in Schritt (2) erstellt wurde.

Alles ganz einfach, wie man sieht. Man sollte es also ruhig selber einmal versuchen.