ftp_put()
La fonction ftp_put() est une fonction PHP intégrée qui envoie un fichier vers un serveur FTP. Cet article la décrit en détail avec des exemples.
La fonction PHP ftp_put()
ftp_put() est une fonction PHP intégrée qui envoie un fichier local vers un serveur FTP distant. Elle est le pendant d'envoi de ftp_get(), qui télécharge un fichier distant vers votre machine. Cette page couvre la signature, les modes de transfert essentiels, un flux de travail complet, la gestion des erreurs et les pièges les plus courants en production.
Vous utilisez ftp_put() après avoir ouvert une connexion avec ftp_connect() et vous être authentifié avec ftp_login().
Syntaxe
ftp_put(
FTP\Connection $ftp,
string $remote_filename,
string $local_filename,
int $mode = FTP_BINARY
): bool| Paramètre | Description |
|---|---|
$ftp | Le handle de connexion FTP retourné par ftp_connect() ou ftp_ssl_connect(). |
$remote_filename | Le chemin de destination sur le serveur, p. ex. /public_html/index.html. |
$local_filename | Le chemin source sur votre machine, p. ex. ./build/index.html. |
$mode | Mode de transfert : FTP_BINARY (par défaut) ou FTP_ASCII. Optionnel depuis PHP 7.3. |
Retourne true en cas de succès et false en cas d'échec.
Note de version : Avant PHP 8.1, le premier argument était une
resourceretournée parftp_connect(). À partir de PHP 8.1, c'est un objetFTP\Connection. Votre code ne change pas — vous passez toujours ce que retourneftp_connect()— mais les vérificationsis_resource()ne fonctionnent plus dessus.
Mode binaire vs. mode ASCII
Choisir le mauvais mode est la cause la plus fréquente du problème « le transfert a réussi mais le fichier est corrompu » :
FTP_BINARYtransfère les octets tels quels. Utilisez-le par défaut pour tout — images, archives, PDF, exécutables, et même les fichiers texte en pratique.FTP_ASCIIréécrit les fins de ligne (\n↔\r\n) pour correspondre à la plateforme de destination. N'est pertinent que pour le texte brut, et il détruira silencieusement tout fichier binaire. En cas de doute, restez surFTP_BINARY.
Un envoi complet
Vérifiez toujours les valeurs de retour de chaque appel FTP plutôt que de supposer qu'une étape a réussi :
<?php
// 1. Open a connection (false on failure)
$ftp = ftp_connect('ftp.example.com');
if ($ftp === false) {
exit("Could not connect to FTP server.\n");
}
// 2. Authenticate
if (!ftp_login($ftp, 'username', 'password')) {
ftp_close($ftp);
exit("FTP login failed.\n");
}
// 3. Behind a firewall/NAT? Passive mode is almost always required.
ftp_pasv($ftp, true);
// 4. Upload: local file -> remote path, binary mode
$ok = ftp_put($ftp, '/public_html/index.html', './build/index.html', FTP_BINARY);
echo $ok
? "Upload succeeded.\n"
: "Upload failed.\n";
// 5. Always close
ftp_close($ftp);Notez l'ordre des arguments : le chemin distant en premier, la source locale en second — l'inverse de ce que beaucoup de personnes attendent. Les inverser fait tenter à PHP de lire un fichier local inexistant et l'appel échoue.
Gestion des erreurs
ftp_put() retourne false et émet un avertissement PHP en cas d'échec. Convertissez cela en un résultat clair et exploitable plutôt que de laisser un avertissement parasite s'infiltrer dans votre sortie :
<?php
$remote = '/public_html/index.html';
$local = './build/index.html';
// Catch the "no such local file" case before touching the network.
if (!is_readable($local)) {
exit("Local file '$local' is missing or unreadable.\n");
}
if (!ftp_put($ftp, $remote, $local, FTP_BINARY)) {
// Common causes: wrong remote directory, no write permission,
// disk quota exceeded, or passive mode not enabled.
echo "Failed to upload '$local' to '$remote'.\n";
} else {
echo "Uploaded '$local' to '$remote'.\n";
}
ftp_close($ftp);Causes d'échec courantes
- Ordre des arguments incorrect — chemin distant et chemin local inversés.
- Mode passif non activé — la plupart des serveurs derrière un NAT nécessitent
ftp_pasv($ftp, true)après la connexion. - Répertoire distant manquant —
ftp_put()ne crée pas les dossiers ; utilisezftp_mkdir()au préalable. - Aucune permission d'écriture ou quota dépassé côté serveur.
- Mauvais mode de transfert corrompant un fichier binaire (utilisez
FTP_BINARY).
Envoi depuis un flux ouvert
Si vos données sont déjà un handle de fichier ouvert (ou proviennent d'un wrapper de flux plutôt que d'un chemin sur disque), utilisez ftp_fput() à la place — il prend une ressource de flux en lieu et place d'un nom de fichier local.
Conclusion
ftp_put() envoie un fichier local vers un serveur FTP distant. Retenez les trois points qui causent la plupart des problèmes : passez le chemin distant en premier, conservez FTP_BINARY sauf si vous avez une raison précise d'utiliser l'ASCII, et vérifiez chaque valeur de retour. Pour des transferts non bloquants qui ne figent pas votre script, consultez ftp_nb_put().