Loading

FTP mit PHP

14
Jan
22

In diesem Artikel möchte ich mich etwas näher mit den Fähigkeiten von PHP auseinandersetzen. Ich möchte euch einen einfachen Weg zeigen, wie ihr mittels PHP eure Dateien auf einen FTP Server uploaden könnt. Warum man dies in PHP machen sollte und nicht etwa mit einem normalen FTP Client Programm? Nun, dafür gibt es mehrere Gründe.

Oft kann es vorkommen, das man sich hinter einer Firewall befindet und keinen Zugang auf den FTP Port erhält. Somit lassen sich keine FTP Clients verwenden. Oder man möchte Benutzern der eigenen Seite eine Möglichkeit bieten, Dateien per FTP auf den Server zu kopieren. Beides lässt sich mit einem simplen Formular und etwas PHP bewältigen. Doch kommen wir gleich zum Eingemachten.

Um FTP benutzen zu können, benötigen wir ein paar Funktionen, die ich im Folgenden näher erklären werde.

ftp_connect - Verbindung zum Host herstellen

Als allererstes müssen wir eine Verbindung zum FTP Host herstellen. Das geschieht mit der Funktion

ftp_connect(String Host, int[Port]).

$ftp_server = "ftp.meinserver.de";
$connection_id = ftp_connect($ftp_server);

Der Parameter Port ist optional und standardmäßig auf 21 eingestellt, was der Standard Port für FTP ist.

ftp_login - Anmelden einer FTP-Verbindung

Nachdem wir eine Verbindung zum Host hergestellt haben, müssen wir uns nur noch mit Benutzernamen und Passwort anmelden. Die dazugehörige Funktion in PHP lautet

ftp_login (int conn_id, string Benutzername, string Passwort).

 
$benutzername = "Benutzername";
$passwort = "Passwort";
$login_result = ftp_login($connection_id, $benutzername, $passwort);
 

Wenn alles gutgegangen ist, haben wir jetzt Zugriff auf die Dateien. Nun müssen wir nur noch die gewünschte Datei hochladen.

ftp_put - Datei auf den FTP Server übertragen

Sehen wir uns zuerst einmal die Funktion an.

ftp_put (int conn_id, string Zieldatei, string Lokale_Datei, int Modus)

Lokale_Datei ist hierbei die Datei die als Datei namens Zieldatei auf dem Server gespeichert werden soll. Wichtig ist auch der Parameter Modus, der bestimmt ob die Datei im binären (FTP_BINARY) oder im ASCII (FTP_ASCII) Modus übertragen wird. In unserem Beispiel würde das Ganze dann wie folgt aussehen:

 
$zieldatei = "test.htm";
$lokale_datei = "test.htm";
$upload = ftp_put ($connection_id, $zieldatei, $lokale_datei, FTP_ASCII);
 

ftp_quit - Die FTP Verbindung wieder schließen

Wenn alles erledigt wurde, was zu erledigen war, müssen wir die Verbindung auch wieder schließen. Ordnung muß sein. Die dazugehörige Funktion ist sehr simple.

ftp_quit(int conn_id)

Sie ist so simple, das ich jetzt kein Beispiel zeigen möchte, sondern lieber gleich alles in einem großen Script zusammenfasse.

Das fertige Script

Als Beispiel möchte ich euch ein einfaches Script zeigen, das es Besuchern erlaubt Textdateien auf einen gewünschten FTP Server zu laden. Dazu können sie die Datei mit folgendem Formular auswählen und abschicken:

<html>
<head>
<title>Datei Upload</title>
</head>
 
<body bgcolor="#FFFFFF" text="#000000">
<h1>Schicken Sie uns ihre Texte</h1>
<form action="ftpbeispiel.php" enctype="multipart/form-data" method="POST">
 
 Wählen Sie eine Textdatei (txt, html usw.)
    von Ihrem Rechner aus:
<input name="lokale_datei" type="file"
    size="50" maxlength="1024" accept="text/*">
 
Verzeichnis/Zieldatei<br>
<input type="text" name="zieldatei">
<input type="submit" name="Abschicken"
    value="Abschicken">
</form>
 
</body>
</html>
 

Ist das Formular ausgefüllt und abgeschickt, werden die Daten an das folgende Script gesendet und dort verarbeitet. Die drei ersten Variablen müssen noch an den eigenen FTP Server angepasst werden. Die Dateien werden relativ zu dem Verzeichnis abgelegt, in dem sich dieses Script befindet.

 
<?php
// Diese Variablen bitte ändern
$ftp_server = "ftp.meinserver.de";
$benutzername = "mustermann";
$passwort = "geheim";
 
// Die Verbindung herstellen
$connection_id = ftp_connect($ftp_server);
 
// Mit Benutzername und Kennwort anmelden
$login_result = ftp_login($connection_id, $benutzername, $passwort);
 
// überprüfen ob alles gutgegangen ist
if ((!$connection_id) || (!$login_result)) {
  echo "<H1>Ftp-Verbindung nicht hergestellt!<H1>";
  echo "<P>Verbindung mit ftp_server als Benutzer $benutzername nicht möglich!</P>";
  die;
} else {
  echo "<P>Verbunden mit ftp_server als Benutzer $benutzername</P>";
}
 
// Die aus dem Forumular übergebenen Daten abfragen
$zieldatei = $_POST['zieldatei'];
$lokale_datei = $_POST['lokale_datei'];
 
// Hochladen der datei
$upload = ftp_put($connection_id, $zieldatei, $lokale_datei, FTP_ASCII);
 
// Upload-Status überprüfen
if (!$upload) {
  echo "<P>Ftp upload war fehlerhaft!</P>";
} else {
  echo "<P>Datei $slokale_datei auf $host als $zieldatei geschrieben</P>";
}
 
// Schließen der Verbindung
ftp_quit($connection_id);
?>
 

So jetzt alles auf euren Server laden und fertig.

Wichtig!

Da es dieses Script jedem erlaubt Dateien auf euren Server zu laden, solltet ihr es mit Bedacht einsetzen. Denkbar wäre ein Passwortschutz und eine Beschränkung der Dateigröße.

Dir hat dieser Artikel gefallen?
Dann abonniere doch einfach meinen RSS feed .

Dir gefallen vielleicht auch folgende Beiträge

22 Kommentare:
  1. DieKrabbe 17 Oct, 2008

    Deine Beschreibung ist ja soweit tranzparent und sachlich. Doch ich vermisse hier die Übergabe der $_POST Variablen aus dem HTML Teil an den PHP Teil.

    Du schreibst:

    // Hochladen der datei
    $upload = ftp_put($connection_id, $zieldatei, $lokale_datei, FTP_ASCII);

    Doch wo in der PHP werden die Variablen $zieldatei oder $lokale_datei definiert?

  2. webmatze 18 Oct, 2008

    In dem Formular kannst du zwei Felder sehen, welche diese Variablen beim Absenden dann an das Script übergeben.

    Je nach PHP Einstellungen muss man sich diese möglicherweise auch erst holen:


    $zieldatei = $_POST['zieldatei'];
    $lokale_datei = $_POST['lokale_datei'];

  3. l4mp 10 Nov, 2008

    Er geht davon aus, dass register_globals aktiviert ist-

  4. PhilipKupsik 24 Dec, 2008

    Ich bekomme immer wieder die Fehlermeldung:

    Verbunden mit ftp_server als Benutzer ulmerfeld

    Ftp upload war fehlerhaft!

    und was müsste ich eigendlich in das zweite feld reinschreiben?

  5. webmatze 29 Dec, 2008

    meinst du mit dem zweiten Feld $lokale_datei = $_POST['lokale_datei']?
    Das ist der Name der datei, wie er vom input type=”file” Tag übergeben wird. Also die von der lokalen Festlplatte ausgewählte Datei.
    Über zieldatei wird festgelegt, wie die Datei nach dem Upload auf dem Server heißen soll.

  6. Sandro 29 Mar, 2009

    Was läuft bei mir denn bitte Falsch?

    Fatal error: Call to undefined function: ftp_connect() in /mnt/web6/5

  7. webmatze 30 Mar, 2009

    Das kann damit zu tun haben, dass bei deiner PHP Installation die FTP Funktionen nicht mit geladen/Installiert wurden.
    Diese werden normalerweise mit –enable-ftp bei der Installation mit installiert.
    Vielleicht solltest du dies mal auf deinem Server prüfen, oder deinen Hoster fragen, ob er die FTP Funktionen für PHP aktivieren kann.

  8. Ben 19 Apr, 2009

    Einloggen klappt … diverse Tests haben auch schon geklappt … bei Wiederholungen
    öfter mal Fehlermeldungen :-( … aber eigentlich würde mich mehr interessieren, wie man das Script anpassen muss, wenn man einen Remote Upload starten möchte – sprich: nicht vom/über den eigenen Rechner hochladen, sondern direkt einen Link zu der Datei im Netz eingeben und Upload starten … hatte folgendes Script schon mal gefunden und erfolgreich getestet (schreibt aber die Dateien in das Verzeichnis wo es selbst liegt und leitet sie nicht an einen FTP-Server weiter) und es wäre meine Frage, ob man nicht beide Scripts irgendwie verknüpfen könnte um einen Remote Upload hinzubekommen???

    Remote Download Script

    body {background: black; color: white;}
    a:link {color: #CCFFFF}
    a:visited {color: #FFFFFF}
    a:hover {color: #99FFFF}
    a:active {color: #66FFFF}

    Remote Download Script

    Remote File:
    Local File:    

    31556926,’month’=>2629743,’day’=>86400,’hour’=>3600,’minute’=>60,’second’=>1);
    $flag_hide_zero = true;
    foreach( $periods as $key => $length )
    {
    $temp = floor( $int_seconds / $length );
    if( !$flag_hide_zero || $temp > 0 )
    {
    $build[] = $temp.’ ‘.$key.($temp!=1?’s’:null);
    $flag_hide_zero = false;
    }
    $int_seconds = fmod($int_seconds, $length);
    }
    return ( !empty($build)?implode(‘, ‘, $build):$if_reached );
    }
    if(!is_writeable(‘./’)) {
    exit(‘Cannot write to local dir (needs chmod).’);
    }
    $remote_file = $_POST['url'];
    if($_POST['output']) {
    $local_file = $_POST['output'];
    } else {
    $decoded_url = rawurldecode($remote_file);
    $local_file = substr($decoded_url, strrpos($decoded_url, ‘/’) + 1);
    }
    if(file_exists($local_file)) {
    unlink($local_file);
    echo(“$local_file has Been Replaced”);
    }
    if($remote_file) {
    $startTime = time();
    set_time_limit(0);
    ignore_user_abort();
    $file_in = fopen($remote_file, ‘r’);
    $file_out = fopen(‘./’.$local_file, ‘a’);
    if($file_in) {
    while(!feof($file_in)) {
    $buffer = fread($file_in, 8192);
    fwrite($file_out, $buffer, 8192);
    }
    fclose($file_in);
    fclose($file_out);
    $size = filesize($local_file);
    $humansize = human_file_size($size);
    $seconds = time() – $startTime;
    if($size <= 10240) {
    unlink($local_file);
    exit(“$local_file has been deleted”);
    }
    $count = duration($seconds);
    $url = rawurlencode($local_file);
    exit(“Filename: $local_fileFilesize: $humansizeTime: $count”);
    }
    }
    exit;
    ?>

  9. matthias 16 Jun, 2009

    hi
    hab mir das ganze mal testweise geschnappt und ausprobiert aber ich finde die hochgeladenen datein nicht…. ´wohin werden die gespeichert?

  10. matthias 16 Jun, 2009

    aha ins root verzeichnis aber warum sind meine datein alle 0kb groß

  11. Stefan 24 Jul, 2009

    hi ich habe jetzt das probiert aber es funktioniert einfach nicht bei mir. wie genau sehen die angaben für diese felder aus?:

    $zieldatei = “test.htm”;
    $lokale_datei = “test.htm”;

    Angenommen, der Dateistring auf dem PC ist “C:\Windows\test.txt”

    die indexphp liegt auf dem server im verzeichnis “/htdocs/index.php”
    und jetzt soll auch in diesen ordner die “test.txt” hingeladen werden also: “/htdocs/test.txt”

    Bin dankbar für jede hilfe.
    MfG Stefan

  12. webmatze 24 Jul, 2009

    Ich habe das Script mal mit den Anregungen aus den Kommentare erweitert. Die Parameter $zieldatei und $lokale_datei werden natürlich über das abgesendete HTML Forumular gefüllt und vom PHP Script ausgelesen.
    $lokale_datei ist dabei die über das Dateiauswahlfeld ausgewählte Datei, die Hochgeladen werden soll. $zieldatei ist der Name der Datei, so wie sie auf dem Server heißen soll. Im Idealfall könnte man den Namen der $zieldatei auch aus dem Namen der Variable $lokale_datei parsen. Aber das würde den Ramen dies Artikels sprengen.
    PHP läd die Dateien standardmäßig in ein definiertes Upload Verzeichnis. Dies kann in der php.ini angegeben werden. Der nächste Schritt wäre also, dass man die Datei aus dem Temporären Verzeichnis in das eigentliche Zielverzeichnis kopiert. Auch dies wird in unserem einfachen Script nicht gemacht.
    Das hier beschriebene Script soll eigentlich nur die FTP Funktionen von PHP an einem einfachen Script zeigen.

  13. [...] [...]

  14. [...] setz dich – wie mepeisen bereits schrieb – mit ftp (beispiele | manual) auseinander! VG, der ChillSn __________________ PHP-Code: while($humans>=2) [...]

  15. Werner 17 Aug, 2009

    Vieleicht sollte man es lieber mit $_FILE["lokale_datei"]["tmp_name"]
    machen ???

    Gruss.

  16. htmlfreak 20 Aug, 2009

    @Werner: [quote]$_FILE["lokale_datei"]["tmp_name"]
    machen ??? [/quote]

    Ja allerdings :D aber sonst gut beschrieben

  17. alex 20 Aug, 2009

    Hi,
    hab mir das auch angeschaut und es fehlt was grundlegendes…
    Ihr ladet zuerst eine Datei auf einen Server, dann muss die Datei auf dem Server geöffnet werden und per FTP übertragen werden.

    $uploaddir = ”;
    $uploadfile = $uploaddir. basename($_FILES['lokale_datei']['name']);

    if (move_uploaded_file($_FILES['lokale_datei']['tmp_name'], $uploadfile)) {

    } else {
    print “Possible file upload attack! Here’s some debugging info:\n”;
    print_r($_FILES);
    }

    $ftp_server = “ftp.yourserver.de”;
    $benutzername = “ben”;
    $passwort = “pw”;

    // Die Verbindung herstellen
    $connection_id = ftp_connect($ftp_server);

    // Mit Benutzername und Kennwort anmelden
    $login_result = ftp_login($connection_id, $benutzername, $passwort);
    ftp_pasv($connection_id, true);

    // überprüfen ob alles gutgegangen ist
    if ((!$connection_id) || (!$login_result)) {
    echo “Ftp-Verbindung nicht hergestellt!”;
    echo “Verbindung mit ftp_server als Benutzer $benutzername nicht möglich!”;
    die;
    } else {
    echo “Verbunden mit ftp_server als Benutzer $benutzername”;
    }

    // Die aus dem Forumular übergebenen Daten abfragen
    $zieldatei = $uploadfile;
    $lokale_datei = $uploadfile;
    $fp = fopen($lokale_datei, ‘r’);

    // Hochladen der datei
    echo $connection_id.” “.$zieldatei.” “.$lokale_datei;
    $upload = ftp_put($connection_id, $zieldatei, $lokale_datei, FTP_ASCII);

    // Upload-Status überprüfen
    if (!$upload) {
    echo “Ftp upload war fehlerhaft!”;
    } else {
    echo “Datei $lokale_datei auf $ftp_server in $zieldatei geschrieben”;
    }

    // Schließen der Verbindung
    ftp_quit($connection_id);

  18. Anhktus 25 Oct, 2009

    Warning: ftp_put() [function.ftp-put]: Filename cannot be empty

    was soll mir das nun sagen? datei is aufm rechner vorhanden und ausgewählt, und ich bekomm diese nette meldung…

  19. StremmeNizer 16 Nov, 2009

    @ alex und @ ben.

    Gebt doch mal ne Quelle an, wenn ihr Copy Pastet.

    @ Anhktus

    Kann sein, dass du den Zielnamen nicht deklarirst, sondern nur den Lokalen ausliest.
    wenn du zum beispiel “test.htm” auswählst und uploadest, will er die vllt als “.htm” speichern:

    $zieldatei = $lokale_datei

    ganz einfach, dann heißt die datei aufm server genau wie bei dir lokal

  20. Florian 10 Mar, 2010

    Woran könnte es liegen, das meine hochgeladenen Dateien alle 0kb groß sind ???

  21. webmatze 10 Mar, 2010

    Vielleicht hilft dir dies weiter:

    http://www.php.net/manual/en/function.ftp-fput.php#90517

    Möglicherweise ein Problem mit einer Firewall oder Dateirechten auf dem Server.

  22. JU 11 Mar, 2010

    Hi.

    Der Fehler im Script is das von der lokalen datei nur der name über nommen wird und nicht der pfad wo die datei liegt!
    Auserdem sollte man bei zielname auch noch den pfadt mit ./Name_der_Ziel_Datei.txt kennzeichnen

    Aber sonst top die erklärung
    LG
    JU

Post your comment



Celadon theme by the Themes Boutique