Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] FTP-Funktionen in PHP nutzen
Thema geschlossen
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 24.05.2006, 14:18 Nach oben    #1
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard [PHP] FTP-Funktionen in PHP nutzen

Inhaltsverzeichnis

1) Einleitung
2) Eine Verbindung zu einem FTP-Server herstellen
3) Aktuelles Verzeichnis und sein Inhalt
3.1) Verzeichnisinformationen auswerten
3.2) Das aktuelle Verzeichnis wechseln
4) Download vom Server
5) Upload auf den Server
6) Kopieren, verschieben, löschen, etc.
6.1) Umbenennen von Dateien und Verzeichnissen
6.2) Ein neues Verzeichnis anlegen
6.3) Setzen von Zugriffsrechten
6.4) Ein Verzeichnis / eine Datei löschen
7) Abschließende Worte

1) Einleitung (Inhalt)

Das FTP-Protokoll sollte jedem, der eine Webseite betreibt denke ich ein Begriff sein. Jeder Webspace setzt voraus, dass die Webseite mittels FTP auf den Server hochgeladen wird und das, obwohl FTP mitlerweile kräftig in die Jahre gekommen ist und hier und da einige Schwachstellen aufweist, zumal die Übertragung in der Regel auch offen erfolgt und somit recht unsicher ist. Dass es vielen SystemAdministratoren die Schweißperlen auf die Stirn treibt ist also durchaus verständlich, aber es ändert nichts an der Tatsache, dass FTP immernoch zum alltäglichen Brot gehört.

Mit PHP ist es möglich FTP-Funktionen selbst zu benutzen, um Dateien von / auf einen FTP-Server zu laden, Ordner zu erstellen oder Dateirechte zu ändern. Wie genau die Grundlagen funktionieren soll in diesem Tutorial näher erläutert werden. Üblicherweise laufen die meisten Webserver auf Linux, weshalb ich als Test-System ebenfalls einen Webserver (und somit halt auch FTP-Server) auf Linux-Basis nutze. Daher ist es möglich, dass die hier beschriebenen Daten bei einem Windows-FTP-Server nicht übereinstimmen.

In PHP stehen einige Funktionen zur Verfügung, die unter FTP-Funktionen abrufbar sind. Zu den elementaren Funktionen zählen ftp_connect(), ftp_close() und ftp_login(), da diese generell für den Verbindungsaufbau und -abbau, sowie für den Login zuständig sind.

2) Eine Verbindung zum FTP-Server herstellen (Inhalt)

Wenn wir nun also eine Verbindung zu einem FTP-Server herstellen wollen, fangen wir wie folgt an:

PHP-Code:
<?php
$host 
'mein-ftp-server.de';
$port 21;
$user 'ftpuser';
$pass 'ftppass';

$ftp ftp_connect ($host$port);

ftp_login ($ftp$user$pass);

// [...]

ftp_close ($ftp);
?>
Als erstes speichern wir ein paar Variablen für den Login, dazu gehören der Host + Port, sowie die Anmeldeinformationen Benutzername + Kennwort. Auch wenn wir uns zu einem FTP-Server verbinden wollen, der keine Login-Daten ansich fordert, muss als Benutzername irgendein Synonym (z.B. seine Email-Adresse oder einfach "Anonymous") angegeben werden. Das Kennwort sollte dann entsprechend leer bleiben.
Mit ftp_connect() wird also nun die Verbindung zum FTP-Server auf dem Rechner mein-ftp-server.de mit dem Port 21 hergestellt. Port 21 ist der Standard FTP-Port, sollte dieser in der Realität abweichen aus welchen Gründen auch immer, dann ist er entsprechend zu ändern.
In der Variablen $ftp wird die Verbindungs-ID gespeichert, die bei anderen FTP-Funktionen als erster Parameter mit übergeben werden muss, damit die Funktion weiß, welche FTP-Verbindung gemeint ist.
Nach dem Herstellen der Verbindung wird sich auf dem FTP-Server mit ftp_login() angemeldet, sei es eine anonyme Anmeldung oder auch eine "echte" mit Benutzername/Kennwort. Danach kann man den FTP-Zugang nutzen.
Ist die Nutzung des FTP-Zugangs beendet, sollte mittels ftp_close() die Verbindung wieder geschlossen werden, um Ressourcen freizugeben. In der Dokumentation ist leider nicht beschrieben, ob die Verbindung automatisch getrennt wird, wenn man die FTP-Verbindung nicht manuell schließt, von daher empfehle ich einfach aus Stilgründen die Funktion ftp_close() auszuführen, wenn man seine Arbeiten auf dem FTP-Server getan hat.

3) Aktuelles Verzeichnis und sein Inhalt (Inhalt)

Wir haben nun also eine Verbindung zu einem FTP-Server. Fangen wir also mal einfach an und wollen erstmal wissen, in welchem Pfad wir uns gerade befinden. Die Funktion ftp_pwd() gibt uns die gewünschte Information:

PHP-Code:
<?php
// [...]
$dir ftp_pwd ($ftp);
// [...]
?>
Das aktuelle Verzeichnis wird somit in die Variable $dir gespeichert und steht für weitere Verwendung zur Verfügung. In unserem Beispiel ist $dir jetzt mit '/' gefüllt.

Wollen wir jetzt eine Liste aller Verzeichnisse und Dateien haben, bekommen wir die Antwort mit der Funktion ftp_nlist(), welches ein Array mit allen Dateien und Ordnern zurückgibt. Leider ist aus dieser Liste nicht erkennbar, was ein Verzeichnis und was eine Datei ist. Hier anhand der Dateiendung zu entscheiden wäre zwar eine Möglichkeit, aber ist nicht das Wahre, da auch Verzeichnisse eine Namensgebung wie z.B. "verzeichnis.php" haben könnten.
Abhilfe schafft dabei die Funktion ftp_rawlist(), welche ein Array mit detailierten Informationen zu den Dateien / Verzeichnissen liefert. Hierbei ist jedoch zwingend erforderlich die Informationen zu trennen, denn eine Ausgabe könnte in etwa wie folgt aussehen:

PHP-Code:
<?php
// [...]
$list ftp_rawlist ($ftp$dir);

print_r ($list);
// [...]
?>
Ergebnis:
Code:
Array
(
    [0]  => drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
    [1]  => drwxr-xr-x   2 user     group        4096 Jan 29  2005 cache
    [2]  => -rwxr-xr-x   1 user     group        6725 Jan 29  2005 common.php
    [3]  => -rwxr-xr-x   1 user     group         308 Jan 29  2005 config.php
    [4]  => drwxr-xr-x   2 user     group        4096 Jan 29  2005 db
    [5]  => drwxr-xr-x   2 user     group        4096 Jan 29  2005 docs
    [6]  => -rwxr-xr-x   1 user     group         810 Jan 29  2005 extension.inc
    [7]  => -rwxr-xr-x   1 user     group        3643 Jan 29  2005 faq.php
    [8]  => -rwxr-xr-x   1 user     group       48639 Feb  5  2005 groupcp.php
    [9]  => drwxr-xr-x   4 user     group        4096 Jan 29  2005 images
    [10] => drwxr-xr-x   2 user     group        4096 Jan 29  2005 includes
    [11] => -rwxr-xr-x   1 user     group       14515 Jan 29  2005 index.php
    [12] => drwxr-xr-x   4 user     group        4096 Jan 29  2005 language
    [13] => -rwxr-xr-x   1 user     group        7362 Jan 29  2005 login.php
    [14] => -rwxr-xr-x   1 user     group       12150 Jan 29  2005 memberlist.php
    [15] => -rwxr-xr-x   1 user     group       37639 Jan 29  2005 modcp.php
    [16] => -rwxr-xr-x   1 user     group       34446 Jan 29  2005 posting.php
    [17] => -rwxr-xr-x   1 user     group       72546 Jan 29  2005 privmsg.php
    [18] => -rwxr-xr-x   1 user     group        3947 Jan 29  2005 profile.php
    [19] => -rwxr-xr-x   1 user     group       42696 Jan 29  2005 search.php
    [20] => drwxr-xr-x   3 user     group        4096 Jan 29  2005 templates
    [21] => -rwxr-xr-x   1 user     group       23154 Jan 29  2005 viewforum.php
    [22] => -rwxr-xr-x   1 user     group        7234 Jan 29  2005 viewonline.php
    [23] => -rwxr-xr-x   1 user     group       45139 Jan 29  2005 viewtopic.php
)
3.1) Verzeichnisinformationen auswerten (Inhalt)

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Die ersten 10 Zeichen enthalten für uns die Information, ob es sich um ein Verzeichnis handelt oder nicht. Der erste Buchstabe bei einem Verzeichnis ist in dem Fall eines Verzeichnisses ein "d" (directory).

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Ein kleiner Abschweif in die Basics unter Linux: Die Dateirechte werden in den nachfolgenden 9 Buchstaben gesetzt, die sich in 3 mal 3 Buchstaben (rwx - r = read, w = write, x = execute) aufgeteilt sind.
Die ersten 3 stehen für den Benutzer, die zweiten 3 für die Gruppe der Datei und die letzten 3 für alle anderen Benutzer.
Die Datei "common.php" kann hier also vom Benutzer "user" gelesen, geschrieben und ausgeführt werden (rwx), wohingegen die Gruppe "group" und alle anderen lediglich Rechte zum Lesen und Ausführen haben (r-x).

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Die Zahl, die danach folgt ist bei Dateien immer 1 und gibt bei Verzeichnissen die Anzahl der darin enthaltenen weiteren Verzeichnisse an. Hier ist zu beachten, dass in jedem Verzeichnis die "Verzeichnisse" "." und ".." mitgezählt werden. Hat das Verzeichnis also keine Unterverzeichnisse, steht hier eine 2, was ebenfalls ein Hinweis für ein Verzeichnis ist, neben dem "d"-Flag ganz am Anfang der Zeile.

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Wie unschwer zu erkennen sein sollte, handelt es sich bei den nächsten 2 Angaben um den Benutzer und die Gruppe der Datei, deshalb werde ich auch nicht weiter darauf eingehen.

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Die Zahl, die nun folgt gibt die Größe der Datei in Byte an. Bei Verzeichnissen ist die Größe immer 4096, da aber auch Dateien diese Größe haben können, ist es ein eher unzuverlässiger Indikator für ein Verzeichnis.

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin
Nun folgt das Datum der letzten Änderung.

Code:
drwxr-xr-x   2 user     group        4096 Jan 29  2005 admin 
Zu guterletzt kommt der Name des Verzeichnisses bzw. der Datei.

Um die Daten zu trennen nutze ich die Funktion preg_split(), damit im Gegensatz zu explode() keine Leerzeilen entstehen.

PHP-Code:
<?php
// [...]
foreach ($list AS $data)
{
  
$data preg_split ('°[\s]+°'$data);
  
print_r ($data);
}
// [...]
?>
Ergebnis:
Code:
Array
(
    [0] => drwxr-xr-x
    [1] => 2
    [2] => user
    [3] => group
    [4] => 4096
    [5] => Jan
    [6] => 29
    [7] => 2005
    [8] => admin
)
Wir haben nun also ein Array, in dem Alle Informationen enthalten sind, die wir benötigen. Der Name steht im Array mit dem Key 8 und ob es ein Verzeichnis ist oder nicht, entnehmen wir dem Key 0, dessen erster Buchstabe das Kennzeichen ist ("d" = Verzeichnis; Alles andere = Datei).

3.2) Das aktuelle Verzeichnis wechseln (Inhalt)

Wenn wir nun also wissen, was es für Verzeichnisse gibt und wollen einfach in ein solches wechseln, nutzen wir die Funktion ftp_chdir():

PHP-Code:
<?php
// [...]
if (ftp_chdir ($ftp'admin') === TRUE)
{
  echo 
'Verzeichniswechsel war erfolgreich!';
}
else
{
  echo 
'Verzeichniswechsel war NICHT erfolgreich!';
}
// [...]
?>
Mit obigem Befehl wechselt man also in das Verzeichnis "admin". Um danach wieder in das darüberliegende Verzeichnis zurück zu wechseln, gibt man als Verzeichnis einfach ".." an, wie es viele aus der Linux-Console oder vielleicht auch noch aus DOS kennen. Man kann auch mehreres kombinieren, wenn wir uns z.B. im Verzeichnis "admin" befinden, nun aber in den Ordner "cache" wechseln wollen, geht das mit "../cache".

4) Download vom Server (Inhalt)

Da wir uns nun auf dem FTP-Server bewegen können, wollen wir auch mal eine Datei vom FTP-Server herunterladen. Dazu dient die Funktion ftp_get().
ACHTUNG! Dateien, die vom FTP-Server heruntergeladen werden, werden auf dem Rechner gespeichert, auf dem das PHP-Script läuft! Dies ist nicht zwangsläufig der Rechner, an dem sie das PHP_Script aufrufen!

PHP-Code:
<?php
// [...]
if (ftp_get ($ftp'./dateilokal.ext''./dateiaufserver.ext'FTP_BINARY) === TRUE)
{
  echo 
'Der Download war erfolgreich!';
}
else
{
  echo 
'Der Download war NICHT erfolgreich!';
}
// [...]
?>
Der zweite Parameter ist der Pfad + Dateiname, unter dem der Download gespeichert werden soll, wohingegen der dritte Parameter die Datei auf dem FTP-Server angibt, die heruntergeladen werden soll.
Der vierte Parameter ist entweder FTP_BINARY oder FTP_ASCII, wobei letzteres nur bei Text-Dateien verwendet werden sollte.

Nach der Ausführung dieses Befehls, befindet sich die Datei auf dem Rechner, auf dem das PHP-Script ausgeführt wurde.

5) Upload auf den Server (Inhalt)

Der Umgekehrte Weg ist natürlich auch möglich: Eine Datei vom Rechner auf den FTP-Server übertragen geschieht mittels der Funktion ftp_put().
ACHTUNG! Es werden Dateien vom Rechner hochgeladen, auf dem das PHP-Script läuft! Dies ist nicht zwangsläufig der Rechner, an dem sie das PHP_Script aufrufen!

PHP-Code:
<?php
// [...]
if (ftp_put ($ftp'./dateiaufserver.ext''./dateilokal.ext'FTP_BINARY) === TRUE)
{
  echo 
'Der Upload war erfolgreich!';
}
else
{
  echo 
'Der Upload war NICHT erfolgreich!';
}
// [...]
?>
Die Funktion arbeitet also fast genauso, wie ihr Gegenpart ftp_get(), lediglich die Parameter für Ziel und Quelle sind entsprechend vertauscht: Also zweiter Parameter gilt hier das Ziel auf dem FTP-Server und der dritte Parameter ist hier die lokale Quelle der Datei, die hochgeladen werden soll. Für die anderen Parameter gelten die gleichen Grundsätze, wie oben beschrieben.

6) Kopieren, verschieben, löschen, etc. (Inhalt)

Natürlich können nicht nur Dateien hoch- und runtergeladen werden, sondern auch Verzeichnisse und Dateien umbenannt und gelöscht werden.

6.1) Umbenennen von Dateien und Verzeichnissen (Inhalt)

Um z.B. eine Datei oder ein Verzeichnis umbenennen zu können, wird die Funktion ftp_rename() verwendet:

PHP-Code:
<?php
// [...]
if (ftp_rename ($ftp'./altername''./neuername') === TRUE)
{
  echo 
'Umbenennen war erfolgreich!';
}
else
{
  echo 
'Umbenennen war NICHT erfolgreich!';
}
// [...]
?>
Diese Funktion kann auch zum Verschieben von Verzeichnissen und Dateien benutzt werden, indem beim Ziel der Datei schlicht ein anderer Pfad angegeben wird.

6.2) Ein neues Verzeichnis anlegen (Inhalt)

Für ein neues Verzeichnis kommt die Funktion ftp_mkdir() ins Spiel.

PHP-Code:
<?php
// [...]
if (ftp_mkdir ($ftp'neuesverzeichnis') !== FALSE)
{
  echo 
'Anlegen eines neuen Verzeichnisses war erfolgreich!';
}
else
{
  echo 
'Anlegen eines neuen Verzeichnisses war NICHT erfolgreich!';
}
// [...]
?>
Mit dieser Funktion wird das Verzeichnis "neuesverzeichnis" angelegt. Anders, als bei den obigen Funktionen, wird hier der Name des Verzeichnisses im Erfolgsfall zurückgegeben und im Fehlerfall FALSE. Deswegen muss die Bedingung abgeändert werden.

6.3) Setzen von Zugriffsrechten (Inhalt)

Um die Rechte für dieses Verzeichnis zu setzen, nutzt man die Funktion ftp_site() (gilt ebenso für Verzeichnisse, wie auch für Dateien; Ab PHP 5 gibt es auch direkt die Funktion ftp_chmod()):

PHP-Code:
<?php
// [...]
if (ftp_site ($ftp'CHMOD 644 neuesverzeichnis') === TRUE)
{
  echo 
'Ändern der Zugriffsrechte war erfolgreich!';
}
else
{
  echo 
'Ändern der Zugriffsrechte war NICHT erfolgreich!';
}
// [...]
?>
6.4) Ein Verzeichnis / eine Datei löschen (Inhalt)

Sollte man das Verzeichnis wieder löschen wollen, so geht das mit ftp_rmdir():

PHP-Code:
<?php
// [...]
if (ftp_rmdir ($ftp'neuesverzeichnis') === TRUE)
{
  echo 
'Löschen des Verzeichnisses war erfolgreich!';
}
else
{
  echo 
'Löschen des Verzeichnisses war NICHT erfolgreich!';
}
// [...]
?>
Für Dateien muss die Funktion ftp_delete() genutzt werden, der Aufruf erfolgt jedoch ebenso, wie bei obiger Funktion.

7) Abschließende Worte (Inhalt)

Damit sollten die grundlegendsten Funktionen abgearbeitet sein. Sicherlich gibt es noch ein paar Funktionen mehr, aber ich gehe davon aus, dass am Ende dieses Tutorials verstanden wurde, wie die Funktionen zu handhaben sind :)
Für alle Wissensdurstigen habe ich die Funktionen ja direkt verlinkt und gebe an dieser Stelle auch gerne nochmal den Link zur Doku über FTP allgemein: FTP-Funktionen

In den Kommentaren der Doku stehen manchmal recht nützliche Hinweise, die einem bei manchen speziellen Problemen durchaus weiterhelfen können, also scheut euch nicht davor, auch die Kommentare zu lesen, die Leute sind schon nicht dumm, die die schreiben ;)

Falls ihr noch Anmerkungen oder Verbesserungsvorschläge habt, dann scheut euch aber ebensowenig mir das mitzuteilen :)

MfG
Lutz alias MrNiceGuy

Geändert von Jann Hendrik (27.06.2007 um 11:57 Uhr)
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Thema geschlossen

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ftp Root Per Php cspiegl PHP-Programmierung 18 13.05.2007 10:49
[PHP] Mit PHP dynamisch einen RSS-Feed aktualisieren Jann Hendrik Tutorials 0 13.03.2007 09:52
PHP FTP function ... again juergreh PHP-Programmierung 3 08.05.2006 14:12
[PHP] Erstellung und Bearbeitung von Bildern mittels PHP WarrenFaith Tutorials 1 23.08.2005 15:30
[PHP] Kontrollstrukturen in PHP Jann Hendrik Tutorials 7 09.12.2004 21:28


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47