W3docs

PHP FTP

FTP en PHP permet de transférer des fichiers entre client et serveur via TCP. Découvrez connexion, authentification, upload, download et gestion de fichiers.

Introduction

FTP (File Transfer Protocol) est un protocole réseau standard permettant de transférer des fichiers entre un client et un serveur via une connexion TCP. PHP intègre une extension FTP (ext-ftp) qui permet à vos scripts de se connecter à un serveur distant et de déplacer des fichiers de manière programmée — utile pour déployer des ressources, synchroniser des sauvegardes ou récupérer des flux de données depuis le serveur d'un partenaire.

Ce chapitre couvre l'ensemble du processus : connexion, authentification, passage en mode passif, envoi et téléchargement de fichiers, listage et gestion des fichiers distants, et enfin fermeture propre de la connexion. Il explique également les précautions de sécurité à connaître avant d'utiliser le FTP simple en production.

Note de sécurité en premier. Le FTP simple envoie votre nom d'utilisateur, votre mot de passe et le contenu de vos fichiers sans chiffrement. Pour toute information sensible, utilisez ftp_ssl_connect() (FTP over TLS) ou préférez SFTP (SSH File Transfer Protocol), que l'extension FTP ne supporte pas — utilisez l'extension PHP SSH2 ou une bibliothèque telle que phpseclib pour SFTP.

Le processus FTP typique

Chaque script FTP suit la même structure, quelle que soit l'opération effectuée :

  1. Connexion au serveur — ftp_connect() (ou ftp_ssl_connect() pour FTPS).
  2. Authentificationftp_login().
  3. Configuration — généralement ftp_pasv($conn, true) pour activer le mode passif.
  4. Transfert / gestion de fichiers — ftp_put(), ftp_get(), ftp_nlist(), etc.
  5. Fermetureftp_close().

Connexion à un serveur FTP

Établissez une connexion avec ftp_connect(). Cette fonction prend le nom d'hôte (et optionnellement le port et le délai d'attente) et retourne un objet FTP\Connection en cas de succès (une ressource avant PHP 8.1), ou false en cas d'échec.

<?php

$conn = ftp_connect("ftp.example.com", 21, 10); // host, port, timeout (seconds)
if ($conn === false) {
    die("Could not connect to FTP server");
}
echo "Connected.";

Notez que la connexion ne vous authentifie pas — à ce stade, vous disposez d'un canal anonyme non authentifié. Vous devez encore appeler ftp_login() avant que le serveur vous autorise à faire quoi que ce soit d'utile.

Utiliser FTPS (FTP over TLS)

Pour chiffrer les canaux de contrôle et de données, remplacez ftp_connect() par ftp_ssl_connect(). Le reste de l'API est identique :

<?php

$conn = ftp_ssl_connect("ftp.example.com");
if ($conn === false) {
    die("Could not open a secure FTP connection");
}

Authentification et mode passif

Après la connexion, authentifiez-vous avec ftp_login(). Pour les serveurs publics autorisant l'accès anonyme, utilisez le nom d'utilisateur anonymous avec un mot de passe ressemblant à une adresse e-mail.

<?php

$conn = ftp_connect("ftp.example.com");

if (!ftp_login($conn, "username", "password")) {
    ftp_close($conn);
    die("Login failed");
}

// Most networks behind a firewall/NAT require passive mode.
ftp_pasv($conn, true);

echo "Logged in.";

Pourquoi le mode passif est important. En mode actif, le serveur ouvre une connexion de données vers votre client, ce que les pare-feu et les routeurs NAT bloquent presque toujours. En mode passif, c'est le client qui ouvre la connexion de données vers le serveur, ce qui fonctionne derrière les pare-feu. En règle générale, appelez ftp_pasv($conn, true) juste après la connexion. Il doit être défini après ftp_login(), pas avant.

Envoi de fichiers

Utilisez ftp_put() pour envoyer un fichier local vers le serveur. Sa signature est ftp_put($conn, $remote_file, $local_file, $mode), où $mode est FTP_BINARY ou FTP_ASCII.

<?php

$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);

if (ftp_put($conn, "/public_html/report.pdf", "report.pdf", FTP_BINARY)) {
    echo "Upload successful";
} else {
    echo "Upload failed";
}

ftp_close($conn);

FTP_BINARY vs FTP_ASCII. Utilisez FTP_BINARY pour tout ce qui n'est pas du texte brut — images, PDF, archives, exécutables — car le mode ASCII réécrit les fins de ligne et corrompra les données binaires. Utilisez FTP_ASCII uniquement lorsque vous souhaitez spécifiquement que les fins de ligne soient traduites entre plateformes pour les fichiers texte. En cas de doute, choisissez FTP_BINARY ; c'est la valeur par défaut sûre.

Pour les gros fichiers, vous pouvez envoyer de manière non bloquante avec ftp_nb_put(), ce qui permet à votre script d'effectuer d'autres tâches entre les fragments.

Téléchargement de fichiers

ftp_get() récupère un fichier distant vers le système de fichiers local. L'ordre des arguments est ftp_get($conn, $local_file, $remote_file, $mode) — notez que la destination locale vient en premier, à l'opposé de ftp_put(). Confondre ces deux ordres est l'erreur FTP la plus fréquente.

<?php

$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);

// local_file first, then remote_file
if (ftp_get($conn, "backup.zip", "/backups/backup.zip", FTP_BINARY)) {
    echo "Download successful";
} else {
    echo "Download failed";
}

ftp_close($conn);

Listage et gestion des fichiers distants

L'extension FTP fait bien plus que transférer des fichiers. Les fonctions de gestion courantes comprennent :

FonctionRôle
ftp_nlist($conn, $dir)Tableau des noms de fichiers dans un répertoire
ftp_rawlist($conn, $dir)Listing détaillé de style ls -l
ftp_size($conn, $file)Taille du fichier en octets (-1 en cas d'erreur)
ftp_mkdir($conn, $dir)Créer un répertoire
ftp_rmdir($conn, $dir)Supprimer un répertoire (vide)
ftp_delete($conn, $file)Supprimer un fichier
ftp_rename($conn, $from, $to)Renommer / déplacer un fichier
ftp_chdir($conn, $dir)Changer le répertoire de travail
ftp_pwd($conn)Répertoire de travail courant
ftp_chmod($conn, 0644, $file)Modifier les permissions du fichier
<?php

$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);

$files = ftp_nlist($conn, "/public_html");
foreach ($files as $file) {
    echo $file, " — ", ftp_size($conn, $file), " bytes\n";
}

ftp_close($conn);

Fermeture de la connexion

Libérez toujours la connexion avec ftp_close() lorsque vous avez terminé. Encapsuler le processus dans un try/finally garantit que le socket est fermé même si une erreur est levée en cours de route :

<?php

$conn = ftp_connect("ftp.example.com");
if (!$conn || !ftp_login($conn, "username", "password")) {
    die("Connection or login failed");
}

try {
    ftp_pasv($conn, true);
    ftp_put($conn, "/public_html/index.html", "index.html", FTP_BINARY);
} finally {
    ftp_close($conn);
}

Bonnes pratiques et pièges courants

  • Préférez FTPS ou SFTP. N'envoyez jamais de credentials via FTP simple sur l'internet public.
  • Activez toujours le mode passif (ftp_pasv) sauf si vous avez une raison spécifique de ne pas le faire.
  • Choisissez le bon mode de transfertFTP_BINARY pour les données binaires, FTP_ASCII uniquement pour le texte où la traduction des fins de ligne est souhaitée.
  • Surveillez l'ordre des argumentsftp_put est (remote, local), ftp_get est (local, remote).
  • Fermez toujours la connexion avec ftp_close().
  • Vérifiez chaque valeur de retour. Les fonctions FTP retournent false en cas d'échec plutôt que de lever une exception, les échecs silencieux sont donc faciles à manquer.
  • ext-ftp doit être activée. Vérifiez avec extension_loaded('ftp') ; si cela retourne false, activez l'extension dans votre php.ini.

Sujets connexes

Pratique

Pratique
Quelles sont les fonctions FTP en PHP ?
Quelles sont les fonctions FTP en PHP ?
Was this page helpful?