Signatur
Beschreibung
ftp_put() überträgt eine Datei vom lokalen Dateisystem auf einen FTP-Server. Die Verbindung muss zuvor mit ftp_connect() und ftp_login() aufgebaut worden sein. Der Rückgabewert gibt an, ob der Upload erfolgreich abgeschlossen wurde.
Der Parameter $mode bestimmt, ob die Datei im Binär- oder ASCII-Modus übertragen wird. Für Textdateien (z. B. HTML, CSV) kann FTP_ASCII verwendet werden, wobei Zeilenenden automatisch konvertiert werden. Für alle anderen Dateien (Bilder, Archive, ausführbare Dateien usw.) sollte stets FTP_BINARY genutzt werden, um Datenverlust zu vermeiden.
Mit dem Parameter $offset lässt sich ein unterbrochener Upload an einer bestimmten Byte-Position fortsetzen (Resume-Funktion). Für einen frischen Upload bleibt dieser Wert auf 0.
Soll der Upload nicht-blockierend ablaufen (also ohne dass das PHP-Skript wartet), kann alternativ ftp_nb_put() eingesetzt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ftp Pflicht | FTP\Connection | Eine aktive FTP-Verbindungsressource, die mit ftp_connect() erstellt wurde. |
|
| $remote_filename Pflicht | string | Der Zielpfad auf dem FTP-Server, unter dem die Datei gespeichert werden soll (z. B. /public_html/bild.jpg). |
|
| $local_filename Pflicht | string | Der Pfad zur lokalen Datei, die hochgeladen werden soll (z. B. /var/www/uploads/bild.jpg). |
|
| $mode | int | FTP_BINARY | Übertragungsmodus: FTP_BINARY (Standard, für Binärdateien) oder FTP_ASCII (für reine Textdateien mit automatischer Zeilenenden-Konvertierung). |
| $offset | int | 0 | Byte-Offset, ab dem der Upload beginnen soll. Nützlich zum Fortsetzen eines abgebrochenen Uploads. Standardmäßig 0 für einen vollständigen Upload. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. fehlende Schreibrechte auf dem Server, Verbindungsproblem oder nicht vorhandene lokale Datei).Beispiele
Einfacher Datei-Upload auf einen FTP-Server
<?php
$ftp = ftp_connect('ftp.example.com');
if (!$ftp) {
die('Verbindung zum FTP-Server fehlgeschlagen.');
}
if (!ftp_login($ftp, 'benutzername', 'geheimespasswort')) {
ftp_close($ftp);
die('FTP-Login fehlgeschlagen.');
}
$lokal = '/var/www/html/bilder/foto.jpg';
$remote = '/public_html/bilder/foto.jpg';
if (ftp_put($ftp, $remote, $lokal, FTP_BINARY)) {
echo 'Datei erfolgreich hochgeladen.';
} else {
echo 'Upload fehlgeschlagen.';
}
ftp_close($ftp);
Unterbrochenen Upload fortsetzen (Resume)
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzername', 'geheimespasswort');
// Bereits übertragene Bytes auf dem Remote-Server ermitteln
$remoteGroesse = ftp_size($ftp, '/public_html/grosse-datei.zip');
$offset = ($remoteGroesse > 0) ? $remoteGroesse : 0;
$lokal = '/var/www/tmp/grosse-datei.zip';
$remote = '/public_html/grosse-datei.zip';
if (ftp_put($ftp, $remote, $lokal, FTP_BINARY, $offset)) {
echo "Upload ab Byte {$offset} erfolgreich fortgesetzt.";
} else {
echo 'Fortsetzen des Uploads fehlgeschlagen.';
}
ftp_close($ftp);
// Wichtig · Fallstricke
Sicherheitshinweis: Speichere FTP-Zugangsdaten (Benutzername und Passwort) niemals direkt im Quellcode. Nutze stattdessen Umgebungsvariablen oder externe Konfigurationsdateien, die nicht im Webroot liegen.
Passiver Modus: Bei Verbindungsproblemen durch Firewalls oder NAT sollte ftp_pasv($ftp, true) nach dem Login aufgerufen werden, um den passiven Modus zu aktivieren.
Datenverlust durch falschen Modus: Das Verwenden von FTP_ASCII für Binärdateien (Bilder, ZIP-Archive, PDFs etc.) kann die Dateien korrumpieren, da Bytewerte, die Zeilenenden entsprechen, konvertiert werden.
Ab PHP 8.1 ist der Typ des $ftp-Parameters FTP\Connection statt der vorher verwendeten Ressource.