So arbeiten Sie mit PHP und FTP

In diesem Lernprogramm möchten wir mit PHP eine FTP-Klasse erstellen, die gut geschrieben, nützlich und erweiterbar ist.

Unser Ziel umreißen

Es ist immer wichtig, zuerst genau zu beschreiben, welche Funktionalität Ihre Klasse beinhalten soll. In unserem Fall:

  • Verbindung zu einem Server
  • Erstellen Sie einen Ordner auf dem Server
  • Eine Datei hochladen
  • ändere die Richtung
  • Abrufen der Verzeichnisliste
  • Laden Sie eine Datei herunter

Wann würde ich eine FTP-Klasse verwenden??

Es gibt mehrere Fälle, in denen diese Art von Klasse verwendet werden kann. Ein paar Szenarien könnten sein:

  • Automatisches Hochladen von Bildern (z. B. einer Galerie) auf die Website eines Kunden (idealerweise in Verbindung mit meinem Bildanpassungsprogramm)
  • Führen Sie Off-Site-Sicherungen durch, indem Sie eine Datenbanksicherungsdatei von einem Server auf einen anderen übertragen. (Hinweis: Dies wird nicht für vertrauliche Informationen empfohlen, da FTP kein sehr sicheres Protokoll ist.)

Hinweis: Aufgrund verschiedener Serverkonfigurationen können Probleme mit FTP leicht auftreten. Dieser Code wurde auf mehreren FTP-Servern erfolgreich getestet.


Was ist FTP??

FTP: "Ein Standard-Netzwerkprotokoll, das zum Kopieren einer Datei von einem Host auf einen anderen verwendet wird."

FTP oder File Transfer Protocol ist nach Wikipedia definiert: "Ein Standard-Netzwerkprotokoll, das zum Kopieren einer Datei von einem Host auf einen anderen über ein TCP / IP-basiertes Netzwerk wie das Internet verwendet wird."

Im Wesentlichen können Sie eine oder mehrere Dateien von einem Computer auf einen anderen kopieren.


Schritt 1 - Vorbereitung

Wir fangen so einfach wie möglich an. Erstellen Sie im Stammverzeichnis Ihres neuen Projekts zwei Dateien: index.php und ftp_class.php.

Das index.php Datei ist unsere Hauptseite, die das Objekt erstellt und die erforderlichen Methoden aufruft. Das ftp_class.php ist nur das: unsere ftp-Klasse.

Im nächsten Schritt erstellen wir das Skelett für unsere Klasse. Sobald dies geschehen ist, können Sie jeden Schritt mitverfolgen.


Schritt 2 - Einrichten der Klasse

Die Stärke der objektorientierten Programmierung (Object Oriented Programming, OOP) besteht darin, komplexen Code eine benutzerfreundliche Oberfläche zu bieten. Wenn Sie eine Klasse erstellen - denken Sie an eine Klasse als Muster -, können Sie die Daten einkapseln. Dies ist einfach ein Jargon für einen Begriff, der sich auf das Ausblenden der Daten bezieht. Wir können diese Klasse dann immer wieder verwenden, ohne dass der Code neu geschrieben werden muss. Stattdessen müssen Sie nur die entsprechenden Methoden aufrufen (der Begriff "Methode" ist das gleiche wie Funktion).

Beginnen wir mit der Erstellung unserer FTP-Klasse. Öffne dein ftp_class.php Datei und fügen Sie den folgenden Code hinzu. Dies ist eine Grundklasse-Skelettstruktur, die ich als 'Skelettstruktur' bezeichnet habe.FTPClient'.

Das konstruieren Die Funktion, die als Konstruktor bezeichnet wird, ist eine spezielle Klassenmethode, die automatisch von der Klasse aufgerufen wird, wenn Sie ein neues Objekt oder eine Instanz der Klasse erstellen. Dies ist normalerweise ein guter Ort, um etwas Initialisierung hinzuzufügen. aber für den heutigen zweck brauchen wir es nicht. Trotzdem behalten wir es hier für zukünftige Verwendung.

 Klasse FTPClient // *** Klassenvariablen public function __construct () 

Bitte beachten Sie, dass wir eine verwenden doppelt unterstreichen dafür konstruieren Methode.


Schritt 3 - Klassenvariablen

Als Nächstes legen wir einige Klassenvariablen oder Eigenschaften fest.

 private $ connectionId; private $ loginOk = false; private $ messageArray = array ();

Das "Privatgelände"prefix definiert den Gültigkeitsbereich der Variablen. In diesem Fall bedeutet dies, dass auf die Variable nicht von außerhalb der Klasse zugegriffen werden kann.

Das $ connectionId Variable speichert unseren Verbindungsstrom. Die anderen beiden speichern den Status und alle Meldungen. $ loginOk wird nützlich sein, wenn Sie feststellen, ob wir richtig verbunden sind.


Schritt 4 - Einfache Nachrichtenprotokollierung

In fast jeder Methode rufen wir eine Methode mit dem Namen 'logMessage. Dies ist ein sehr einfacher Message-Handler, der es uns ermöglicht, alle von unserer Klasse erstellten Nachrichten zu erfassen, damit wir dem Benutzer Feedback geben können.

Beachten Sie, dass wir dies nicht tun Rückkehr die eigentlichen Nachrichten aus unseren Methoden. Stattdessen kehren wir zurück wahr oder falsch, basierend darauf, ob eine bestimmte Operation erfolgreich war oder nicht. Dies hat seine Vorteile, aber es zeigt dem Benutzer auch nicht an, was passiert.

Fügen Sie die folgenden zwei Methoden hinzu, damit wir feststellen können, was erfolgreich ist.

Diese Methode akzeptiert eine Variable, $ message. Der Inhalt dieser Variablen wird dank der folgenden Zeile in unserem Klassenarray gespeichert: $ this-> messageArray [] = $ message;

 private Funktion logMessage ($ message) $ this-> messageArray [] = $ message; 

weil $ messageArray ist eine Klassenvariable, über die können Sie darauf zugreifen $ this-> Notation.

Innerhalb einer Klasse, $ das bezieht sich auf das Objekt selbst.

Um die Nachricht abzurufen, rufen wir an getMessages.

 public function getMessages () return $ this-> messageArray; 

Diese Methode ist eine öffentliche Methode. Wie bereits erwähnt, bezieht sich dieses private / öffentliche Geschäft lediglich auf den Gültigkeitsbereich der Variablen oder in diesem Fall auf die Methode. Auf eine private Methode (oder Variable) kann nicht außerhalb der Klasse zugegriffen werden, während eine öffentliche Methode (oder Variable) dies kann.

Da unsere Variable privat ist, benötigen wir eine Möglichkeit, darauf zuzugreifen. Wir tun dies, indem wir unserer Klasse ein a geben Öffentlichkeit Methode, auf die wir dann außerhalb der Klasse zugreifen können. Sie fragen sich vielleicht, warum wir das nicht einfach machen können messageArray Variable öffentlich. Wir können; Das heißt, es ist einfach keine gute Praxis.

Hinweis: Im Web gibt es viele Beispiele für voll ausgebaute Nachrichtenhandler oder für sie bestimmte Klassen. Wir arbeiten an einer einfachen Implementierung für dieses Tutorial.


Schritt 5 - Anschließen

In diesem Schritt fügen wir die verbinden Methode. Dadurch können wir uns mit einem FTP-Server verbinden.

 öffentliche Funktion connect ($ server, $ ftpUser, $ ftpPassword, $ isPassive = false) // *** Grundverbindung einrichten $ this-> connectionId = ftp_connect ($ server); // *** Login mit Benutzername und Passwort $ loginResult = ftp_login ($ this-> connectionId, $ ftpUser, $ ftpPassword); // *** Aktiviert / Deaktiviert den passiven Modus (standardmäßig deaktiviert) ftp_pasv ($ this-> connectionId, $ isPassive); // *** Verbindung überprüfen, wenn ((! $ This-> connectionId) || (! $ LoginResult)) $ this-> logMessage ('FTP-Verbindung ist fehlgeschlagen!'); $ this-> logMessage ('Es wurde versucht, eine Verbindung zu'. $ server. 'für den Benutzer herzustellen.' $ ftpUser, true); falsch zurückgeben;  else $ this-> logMessage ('Verbunden mit'. $ Server. ', für Benutzer'. $ ftpUser); $ this-> loginOk = true; wahr zurückgeben; 

Wir geben unsere Verbindungsinformationen weiter: den Server ($ Server), Nutzername ($ ftpUser), und Passwort ($ ftpPassword) um eine Verbindung herzustellen.

Die erste Codezeile öffnet eine FTP-Verbindung mit ftp_connect, an den angegebenen Server. Wir speichern unsere Verbindung zur Klassenvariablen, $ connectionId oben beschrieben.

Der Code, ftp_login meldet uns bei der angegebenen Verbindung an und übergibt unsere Verbindungs-ID, unser Benutzername und Passwort.

Sie haben vielleicht das bemerkt ftp_pasv Codezeile. Dies schaltet, wie der Kommentar impliziert, den passiven Modus ein / aus. Ich schlage vor, Sie lassen es aus. Wenn Sie jedoch Probleme haben, können Sie es einschalten. Der Passivmodus kann bei der Verbindung über FTP zu einer Stute führen.

Wir ermitteln, ob die Verbindung erfolgreich war. Anschließend protokollieren wir die Ergebnisse, indem wir unsere einfache Message-Handler-Methode aufrufen, logMessage (), und übergeben Sie die Zeichenfolge an das Protokoll. Denken Sie daran: wir verwenden $ this-> zugreifen logMessage (), wie es eine Klassenvariable ist.


Schritt 6 - Objekt aufrufen

Nun, da unsere Klasse funktioniert, können wir es testen! Öffne dein index.php Datei und fügen Sie den folgenden Code hinzu.

Sie benötigen Zugriff auf einen FTP-Server, um mitzuspielen. Wenn Sie Ihren eigenen Server einrichten möchten, probieren Sie Filezilla aus - es ist ebenfalls kostenlos.

Sie werden feststellen, dass ich die FTP-Server-Details hier hinzugefügt habe. Idealerweise werden diese in Ihrem gespeichert Konfig Datei. Ändern Sie diese entsprechend den Einstellungen Ihres FTP-Servers.

Nachdem wir unsere FTP-Serverdetails definiert haben, schließen wir die Klasse mit ein include ('ftp_class.php');. Das bedeutet: Stellen Sie die Klasse auf dieser Seite zur Verfügung. Die nächste Zeile erstellt ein Objekt unserer FTP-Klasse und speichert es in der Variablen, $ ftpObj. $ ftpObj wird jetzt verwendet, um auf öffentliche Methoden innerhalb unserer Klasse zuzugreifen. Dies geschieht mit der -> Notation, genau wie die folgende Zeile durch Aufruf von $ ftpObj -> verbinden Methode und übergeben Sie unsere Serverdetails.

 // *** Definieren Sie Ihren Host, Ihren Benutzernamen und Ihr Passwort. Define ('FTP_HOST', '192.168.1.88'); define ('FTP_USER', 'Blimpf'); define ('FTP_PASS', 'Wels'); // *** Include die Klasse include ('ftp_class.php'); // *** Erstellen Sie das FTP-Objekt $ ftpObj = new FTPClient (); // *** Connect $ ftpObj -> connect (FTP_HOST, FTP_USER, FTP_PASS);

Wie Sie sehen, ist die Verbindung zu unserem FTP-Server sehr einfach, sobald unsere Klasse eingerichtet ist!


Schritt 6b - Anzeigen der Ausgabe

Im letzten Schritt könnten wir den Verbindungsaufruf in eine ob Aussage, wie unten gezeigt. Wenn wir keine Verbindung herstellen, wird der abhängige Code nicht ausgeführt. Wir können dann beliebige Nachrichten an den Benutzer ausgeben, z. B. "verbunden" oder "ausgefallen"..

 // *** Connect if ($ ftpObj -> connect (FTP_HOST, FTP_USER, FTP_PASS)) // *** Dann fügen Sie hier den FTP-Code hinzu. Echo 'connected';  else echo 'Verbindung fehlgeschlagen'; 

Dies ist in Ordnung, obwohl unser Code mit IF / ELSE-Anweisungen schnell aufgebläht wird, wenn wir dies allen unseren Aufrufen hinzufügen. Stattdessen möchte ich eine Alternative anbieten, die die Dinge ein bisschen sauberer und leichter zu folgen macht.

Erinnern Sie sich an die hinzugefügten Message-Handler-Methoden? Wenn Sie die von der Klasse erzeugten Nachrichten anzeigen möchten - hilfreich beim Debuggen / Feedback -, können Sie den folgenden Code nach jeder aufgerufenen Methode hinzufügen.

 print_r ($ ftpObj -> getMessages ());

Dadurch wird die Klassenmeldung angezeigt.


Schritt 7 - Erstes Verzeichnis erstellen

Ausgezeichnet, jetzt ist es an der Zeit, etwas Nützliches zu tun. Die erste Methode, die wir erstellen werden, ist die makeDir Methode. Wie erwartet erstellt diese Methode Verzeichnisse für uns auf dem Server. Der einzige Parameter, den wir übergeben werden, ist der Verzeichnispfad und der Ordnername. wir nennen es $ verzeichnis. Die magische Linie hier ist die ftp_mkdir eingebaute Funktion. Es nutzt unsere geretteten "connectionId"und das ist vorbei $ verzeichnis Variable, um den Ordner zu erstellen.

Fügen Sie folgenden Code hinzu ftp_class.php Datei:

 public function makeDir ($ directory) // *** Wenn das Erstellen eines Verzeichnisses erfolgreich ist? if (ftp_mkdir ($ this-> connectionId, $ verzeichnis)) $ this-> logMessage ('verzeichnis' '. $ verzeichnis.' 'erfolgreich erstellt'); wahr zurückgeben;  else // ***? Sonst versagen. $ this-> logMessage ('Fehler beim Erstellen des Verzeichnisses' '. $ Verzeichnis.' ''); falsch zurückgeben; 

Und um es von dir zu nennen index.php Datei hinzufügen:

 $ dir = 'Fotos'; // *** Verzeichnis erstellen $ ftpObj-> makeDir ($ dir);

Die Variable, $ dir wird auf den Namen des Ordners gesetzt, den wir auf dem Server erstellen möchten. In diesem Fall: "Fotos".

Die nächste Zeile ruft die Methode auf, mit der der Ordner erstellt wird.

Wenn Sie die Fehlermeldung "Berechtigung verweigert" erhalten, stellen Sie sicher, dass Sie in den angegebenen Ordner schreiben können. Möglicherweise müssen Sie den Ordner in einem Verzeichnis erstellen, z. B. / httpdocs.


Schritt 8 - Hochladen einer Datei

Lass uns ein Foto hochladen, genannt zoe.jpg. Beim Hochladen einer Datei müssen wir angeben, welchen Dateityp wir hochladen - binär oder ASCII? Wenn Sie eine Textdatei hochladen, sollten wir diese verwenden ASCII; Andernfalls sollte es auf binär gesetzt werden.

Wir beginnen mit der Einrichtung einer Array mit allen Erweiterungen, die wir für eine verwenden sollten ASCII Typ Upload.

 $ asciiArray = array ('txt', 'csv');

Dann rufen wir die Erweiterung unserer Datei ab, damit wir testen können, ob es sich um eine der Dateien handelt ASCII Typen. Wir ermitteln dies, indem wir die Erweiterung der Datei erhalten, die wir hochladen. Die schnelle und schmutzige Methode, die ich hier verwendet habe, ist
durch "explodieren" der Datei mit dem '.'als Trennzeichen. Dadurch wird die Datei in Teile aufgeteilt und als Array. Mit einer anderen integrierten PHP-Funktion, "end", wählen wir die letzte aus Array Element, das unsere Erweiterung enthält. Es ist ein aufgeräumter Code.

 $ extension = end (explodieren ('.', $ fileFrom));

Als Nächstes testen wir, ob unsere Erweiterung in der Liste (mit in_array) der Dateierweiterungen aufgeführt ist, die als Typ hochgeladen werden sollen ASCII. Wenn es in der Liste erscheint, setzen wir die Variable $ -Modus zu FTP_ASCII; Andernfalls nehmen wir an, dass es vom binären Typ ist, und weisen zu $ -Modus der Wert FTP_BINARY.

 in_array ($ extension, $ asciiArray)

ftp_put lädt eine Datei von Ihrem lokalen Standort in eine Remote-Datei auf dem FTP-Server hoch. Wir geben es unser "connectionId", der Pfad zu der Datei, in die wir hochladen möchten ($ fileTo), der Weg
der Datei, die wir hochladen möchten ($ fileFrom) und der Modus ($ -Modus) was wir gerade festgestellt haben.

Fügen Sie als Nächstes die folgende Methode hinzu ftp_class.php Datei:

 public function uploadFile ($ fileFrom, $ fileTo) // *** Setzt den Übertragungsmodus $ asciiArray = array ('txt', 'csv'); $ extension = end (explodieren ('.', $ fileFrom)); if (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  else $ mode = FTP_BINARY;  // *** Laden Sie die Datei hoch $ upload = ftp_put ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode); // *** Upload-Status prüfen, wenn (! $ Upload) $ this-> logMessage ('FTP-Upload ist fehlgeschlagen!'); falsch zurückgeben;  else $ this-> logMessage ('Uploaded' '. $ fileFrom.' "als ''. $ fileTo); geben Sie true zurück;

Natürlich können Sie jeden gewünschten Ordnernamen erstellen oder hochladen! Fügen Sie dieses nächste Codefragment zu Ihrem hinzu index.php Datei und passen Sie entsprechend an.

 $ fileFrom = 'zoe.jpg'; $ fileTo = $ dir. '/'. $ fileFrom; // *** Lokale Datei in neues Verzeichnis auf dem Server hochladen $ ftpObj -> uploadFile ($ fileFrom, $ fileTo);

Inzwischen sollten Sie sich mit der Benutzerfreundlichkeit dieser Klasse auseinandersetzen! Wir erledigen lediglich einzelne Aufrufe, um unsere Aufgaben zu erledigen - alles dank objektorientierter Programmierung!


Schritt 9 - Anzeigen der Dateien

Lassen Sie uns nun bestätigen, dass sich unsere Datei im Ordner befindet Foto Mappe. Wir können dies tun, indem wir zum 'Foto'Ordner auf unserem Server und zeigen Sie dann den Inhalt an.

Das changeDir Methode verwendet "ftp_chdir", um das aktuelle Verzeichnis auf dem FTP - Server zu ändern. Geben Sie einfach das Verzeichnis an, in das Sie wechseln möchten. Einfach und süß.

ftp_class.php:

 public function changeDir ($ directory) if (ftp_chdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Aktuelles Verzeichnis ist jetzt:'. ftp_pwd ($ this-> connectionId)); wahr zurückgeben;  else $ this-> logMessage ('Verzeichnis konnte nicht geändert werden'); falsch zurückgeben; 

getDirListing zeigt den Inhalt des Verzeichnisses an, in dem Sie sich befinden, indem Sie die Funktion "ftp_nlist". Diese Funktion gibt eine Liste von Dateien in einem bestimmten Verzeichnis zurück. Das aktuelle Verzeichnis ist standardmäßig festgelegt, sodass Sie keine Parameter angeben müssen.

Wenn Sie möchten, können Sie dies überschreiben, indem Sie die $ verzeichnis Pfad, dessen Inhalt Sie anzeigen möchten. Das $ parameter Variable ist standardmäßig '-la'. Dies ist ein Linux-Befehl, um weitere Informationen zum Verzeichnis anzuzeigen. Fühlen Sie sich frei, es zu entfernen oder eine leere Zeichenfolge zu übergeben.

ftp_class.php:
 public function getDirListing ($ directory = '.', $ parameters = '-la') // holt den Inhalt des aktuellen Verzeichnisses $ contentsArray = ftp_nlist ($ this-> connectionId, $ parameters. ". $ -Verzeichnis); contentsArray;

Das getDirListing Methode gibt ein zurück Array welches unser Verzeichnis enthält.

index.php
 // *** Zu Ordner wechseln $ ftpObj-> changeDir ($ dir); // *** Ordnerinhalt abrufen $ contentsArray = $ ftpObj-> getDirListing (); // *** Ausgabe unseres Arrays mit Ordnerinhalten echo '
'; print_r ($ contentsArray); Echo '

';

Ihr Ergebnis sollte so aussehen:


Schritt 10 - Herunterladen einer Datei

Wenn wir den Abschluss dieses Tutorials anstreben, fahren wir als Nächstes mit dem Herunterladen der Datei fort. Die Methode beginnt mit demselben Code wie Datei hochladen, dadurch wird bestimmt, ob die Datei, die wir herunterladen möchten, ist ASCII oder binär.

Für diese Methode geben Sie einfach den Dateinamen (und möglicherweise den Pfad der Datei, die Sie herunterladen möchten) und den Namen der gewünschten Datei an Ihr Client-Rechner.

Um eine Datei herunterladen zu können, müssen Sie anrufen ftp_get.

 ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode, 0)

Dadurch wird eine Datei von einem Remote-Server auf unseren lokalen Computer heruntergeladen. Es akzeptiert den folgenden Parameter: unsere Verbindungs-ID, den Pfad und den Dateinamen, die lokal gespeichert werden sollen (wird überschrieben, wenn dies der Fall ist)
ist bereits vorhanden) ($ fileTo), den Ort und den Namen der Datei auf dem Remote-Server ($ fileFrom) und der Modus ($ -Modus).

ftp_class.php
 public function downloadFile ($ fileFrom, $ fileTo) // *** Setzt den Übertragungsmodus $ asciiArray = array ('txt', 'csv'); $ extension = end (explodieren ('.', $ fileFrom)); if (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  else $ mode = FTP_BINARY;  // Versuchen Sie, $ remote_file herunterzuladen, und speichern Sie es unter $ handle if (ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode, 0)) return true; $ this-> logMessage ('file' '. $ fileTo.' "erfolgreich heruntergeladen ');  else return false; $ this-> logMessage ('Fehler beim Herunterladen der Datei "'. $ fileFrom. '" bis "'. $ fileTo. '' '); 

Wir werden dieselbe hochgeladene Datei herunterladen, indem wir sie unter einem anderen Namen auf unserem Client-Computer speichern.

Hinweis: Stellen Sie erneut sicher, dass Ihre Berechtigungen korrekt festgelegt sind!

Weil wir jetzt in uns sein sollten Foto Ordner, fügen wir keinen Pfad hinzu $ fileFrom Variable - nur der Dateiname.

index.php
 $ fileFrom = 'zoe.jpg'; # Die Position auf dem Server $ fileTo = 'zoe-new.jpg'; # Lokales Verzeichnis zum Speichern unter // *** Datei herunterladen $ ftpObj-> downloadFile ($ fileFrom, $ fileTo);

Schritt 11 - Fertigstellen

Um unsere Klasse zu vervollständigen, fügen wir die magische Methode der Klasse hinzu, __dekonstruieren. Diese Methode schließt unsere Verbindung, wenn der Verweis auf unser Objekt nicht mehr existiert - möglicherweise wurde die Seite geschlossen. In jedem Fall wird dieser Code ausgeführt und die Verbindung wird geschlossen. Es ist immer eine gute Praxis, dies einzufügen, obwohl dies nicht unbedingt notwendig ist.

 öffentliche Funktion __deconstruct () if ($ this-> connectionId) ftp_close ($ this-> connectionId); 

Fazit

Nun, das tut es! Ich hoffe, Sie haben jetzt ein besseres Verständnis für die Verwendung von FTP mit PHP. Sie sollten jetzt über die erforderlichen Fähigkeiten verfügen, um diese Klasse weiter zu erweitern, um andere allgemeine Aufgaben zu unterstützen, beispielsweise das Umbenennen oder Löschen von Dateien und Ordnern.

Teilen Sie uns unbedingt mit, wenn Sie coole PHP-FTP-Clients erstellen!