Signatur
Beschreibung
ftp_fget() überträgt eine Datei vom FTP-Server und schreibt den empfangenen Inhalt in eine bereits mit fopen() geöffnete Datei-Ressource. Im Gegensatz zu ftp_get(), das einen Dateinamen als Ziel erwartet, arbeitet diese Funktion direkt mit einer offenen Datei-Ressource – das ist nützlich, wenn die Datei bereits geöffnet ist oder wenn man in spezielle Streams (z. B. php://temp) schreiben möchte.
Der Parameter $mode bestimmt, ob die Übertragung im Binär- (FTP_BINARY) oder im ASCII-Modus (FTP_ASCII) stattfindet. Im ASCII-Modus werden Zeilenenden je nach Betriebssystem automatisch konvertiert; für alle anderen Dateitypen sollte stets FTP_BINARY verwendet werden, um Datenverlust zu vermeiden.
Mit dem optionalen Parameter $offset lässt sich ein Byte-Offset angeben, ab dem der Download beginnen soll. Dies erlaubt das Fortsetzen unterbrochener Übertragungen oder das gezielte Lesen von Teilbereichen einer Remote-Datei.
Bevor die Funktion aufgerufen wird, muss eine FTP-Verbindung mit ftp_connect() und ftp_login() sowie ein lokaler Datei-Handle mit fopen() im Schreibmodus erstellt worden sein. Nach dem Download sollte die Datei mit fclose() geschlossen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ftp Pflicht | FTP\Connection | Eine aktive FTP-Verbindungsinstanz, die zuvor mit ftp_connect() und ftp_login() erstellt wurde. |
|
| $stream Pflicht | resource | Eine geöffnete, beschreibbare Datei-Ressource (z. B. erzeugt durch fopen()), in die der heruntergeladene Inhalt geschrieben wird. |
|
| $remote_filename Pflicht | string | Pfad und Dateiname der herunterzuladenden Datei auf dem FTP-Server. | |
| $mode | int | FTP_BINARY | Übertragungsmodus: FTP_BINARY (Standard) für binäre Dateien oder FTP_ASCII für Textdateien mit automatischer Zeilenenden-Konvertierung. |
| $offset | int | 0 | Byte-Offset auf der Remote-Datei, ab dem der Download beginnen soll. Nützlich zum Fortsetzen unterbrochener Übertragungen. |
Rückgabewert
true zurück, wenn der Download erfolgreich war, andernfalls false. Im Fehlerfall (z. B. Datei nicht gefunden, Verbindungsproblem) wird false zurückgegeben.Beispiele
Einfacher Datei-Download in eine lokale Datei
<?php
$ftp = ftp_connect('ftp.example.com');
if (!$ftp) {
die('Verbindung fehlgeschlagen.');
}
if (!ftp_login($ftp, 'benutzername', 'passwort')) {
die('Login fehlgeschlagen.');
}
// Passive Übertragung empfohlen (z. B. hinter Firewall)
ftp_pasv($ftp, true);
$localFile = fopen('/tmp/heruntergeladen.txt', 'w');
if (!$localFile) {
die('Lokale Datei konnte nicht geöffnet werden.');
}
$result = ftp_fget($ftp, $localFile, '/remote/pfad/datei.txt', FTP_BINARY);
fclose($localFile);
ftp_close($ftp);
if ($result) {
echo 'Download erfolgreich.';
} else {
echo 'Download fehlgeschlagen.';
}
Download in einen temporären In-Memory-Stream
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzername', 'passwort');
ftp_pasv($ftp, true);
// Temporären Stream im Speicher erstellen
$tmpStream = fopen('php://temp', 'r+');
if (ftp_fget($ftp, $tmpStream, '/remote/pfad/config.json', FTP_BINARY)) {
// Zeiger zurücksetzen und Inhalt lesen
rewind($tmpStream);
$inhalt = stream_get_contents($tmpStream);
$daten = json_decode($inhalt, true);
echo 'Geladene Konfiguration: ' . print_r($daten, true);
} else {
echo 'Fehler beim Herunterladen der Datei.';
}
fclose($tmpStream);
ftp_close($ftp);
Unterbrochenen Download fortsetzen mit Offset
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzername', 'passwort');
ftp_pasv($ftp, true);
$lokaleDatei = '/tmp/grosse_datei.bin';
// Bereits vorhandene Bytes bestimmen
$offset = file_exists($lokaleDatei) ? filesize($lokaleDatei) : 0;
$handle = fopen($lokaleDatei, 'ab'); // An vorhandenen Inhalt anhängen
$result = ftp_fget($ftp, $handle, '/remote/grosse_datei.bin', FTP_BINARY, $offset);
fclose($handle);
ftp_close($ftp);
echo $result ? "Übertragung abgeschlossen." : "Übertragung fehlgeschlagen.";
// Wichtig · Fallstricke
Passive vs. aktive Übertragung: Hinter einer Firewall oder NAT sollte ftp_pasv($ftp, true) vor dem Download aufgerufen werden, da aktive FTP-Verbindungen häufig blockiert werden.
Modus-Wahl: Das Vergessen von FTP_BINARY bei Nicht-Textdateien (Bilder, Archive, ausführbare Dateien) kann zu Datenverlust oder Korruption führen, da im ASCII-Modus Zeilenenden konvertiert werden.
Ab PHP 8.1: Der Parameter $ftp ist nicht mehr vom Typ resource, sondern ein Objekt vom Typ FTP\Connection.
Sicherheit: Der Remote-Pfad sollte niemals direkt aus Benutzereingaben übernommen werden, ohne ihn vorher zu validieren, um Path-Traversal-Angriffe zu verhindern.