Start · Sprachen · PHP · Referenz · ftp_fget

ftp_fget

Funktion

Lädt eine Datei vom FTP-Server herunter und schreibt ihren Inhalt direkt in eine bereits geöffnete lokale Datei-Ressource.

seit PHP 4.0.0 Kategorie: io

Signatur

ftp_fget(FTP\Connection $ftp, resource $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool

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

Typ
bool
Beschreibung
Gibt 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 erfolgreich.

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.";
Übertragung abgeschlossen.

// 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.