Qu'est ce que le File Transfer Protocol ?
La mode actuelle est le cloud dont le principale usage est l'échange de fichiers entre un périphérique (ordinateur, smartphone, tablette, ...) vers un serveur de stockage. Une révolution ?FTP (protocole de transfert de fichiers) est un protocole de communication dont les règles ont été définies en 1971 ! Notre but est de comprendre comment automatiser le transfert de fichiers avec un script PHP et pourquoi pas se construire son propre système de Cloud.
Class PHP Ftp_Connector
La class FTP_Connector est un exemple d'utilisation des fonctions PHP pour l'échange de fichier (Download et Upload) avec un serveur FTP. Le script encapsule les fonctions suivantes:ftp_connect (): ouvrir une connexion FTP,
ftp_login(): s'authentifier auprès du serveur FTP,
ftp_nb_get(): charger un fichier,
ftp_nb_put(): uploader un fichier.
<?php
/**
* Transferer un fichier via FTP
* http://www.fobec.com/php5/1176/transferer-fichier-via-ftp.html
* @author Fobec avril 2016
*/
class Ftp_Connector {
//identifiant de connexion
private $hftp = null;
/**
* Se connecter au serveur FTP
* @param type $ftp_host
* @param type $ftp_user
* @param type $ftp_password
* @return boolean
*/
public function connect($ftp_host, $ftp_user, $ftp_password) {
$this->hftp = @ftp_connect($ftp_host);
$login = @ftp_login($this->hftp, $ftp_user, $ftp_password);
if ($this->hftp == FALSE || $login == FALSE) {
return FALSE;
}
return TRUE;
}
/**
* Fermer la connexion FTP
*/
public function close() {
ftp_quit($this->hftp);
}
/**
* Lister le contenu d'un répertoire distant
* @param type $path
* @return string
*/
public function getDirContents($path) {
if ($this->hftp == FALSE) {
return 'connect first !';
}
return ftp_nlist($this->hftp, $path);
}
/**
* Charger un fichier
* @param type $file_local
* @param type $file_src
* @return string
*/
public function load($file_local, $file_src) {
if ($this->hftp == FALSE) {
return 'connect first !';
}
$ret = ftp_nb_get($this->hftp, $file_local, $file_src, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
$ret = ftp_nb_continue($this->hftp);
}
if ($ret != FTP_FINISHED) {
echo "Download failed";
exit(1);
}
}
/**
* Uploader un fichier
* @param type $file_dest
* @param type $file_local
* @return string
*/
public function put($file_dest, $file_local) {
if ($this->hftp == FALSE) {
return 'connect first !';
}
// Initialisation du chargement
$ret = ftp_nb_put($this->hftp, $file_dest, $file_local, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
$ret = ftp_nb_continue($this->hftp);
}
if ($ret != FTP_FINISHED) {
echo "Upload failed";
exit(1);
}
}
}
?>
Pour communiquer avec un serveur FTP, les étapes sont les suivantes:
1. ouvrir une connexion FTP par défaut sur le port 21 pour les commandes et le port 20 pour les données,
2. obtenir une session valide en s'authentifiant,
3. passer les commande de son choix au serveur.
Exemple de transfert de fichier en PHP
A l'aide la class PHP Ftp_Connector, nous allons communiquer avec le serveur FTP pour lister le contenu d'un répertoire, télécharger un fichier et uploader une ressource.<?php
//Mes identifiants
$ftp_server = 'adresse_serveur.fr';
$ftp_user_name = "username";
$ftp_user_pass = "password";
$ftp_connector = new Ftp_Connector();
//Connexion et identification
$b = $ftp_connector->connect($ftp_server, $ftp_user_name, $ftp_user_pass);
if ($b) {
//Liste des fichiers sur la racine du serveur
$nlist = $ftp_connector->getDirContents('/');
print_r($nlist);
//Télécharger un fichier
$ftp_connector->load("fichier_local.txt", "/repertoire/fichier_distant.txt");
//Uploder un fichier
$ftp_connector->put("/repertoire/image_distant.png", "image_local.png");
$ftp_connector->close();
}
exit(0);
?>
Pour utiliser la class PHP en production, il convient d'ajouter la gestion des erreurs qui ne sont pas remontées vers le controler. Pour information, les fonctions PHP dédiées au transfert de fichier sur le port FTP inclues également:
ftp_pwd(): indique le répertoire courant,
ftp_chdir(): change le dossier courant,
ftp_mkdir(): création d'un nouveau dossier,
ftp_pasv(): active ou désactive le mode passif.
Une application pratique de la communication avec un serveur FTP est la sauvegarde de données. En effet, le script PHP prend en charge la collecte des informations puis ouvre un connexion vers le serveur distant pour y déposer les archives.
De plus, un compte FTP peut être facilement configurer pour limiter les risques. Bien souvent, un couple identifiant / mot de passe est crée sur le serveur avec des droits réduits servant uniquement à la dépose de fichier.