Publié le 29/04/2016
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Transferer un fichier via FTP

Pour échanger des fichiers avec un serveur, l’administrateur configure un accès FTP. En effet, ce protocole permet d'envoyer des données (Upload) et de recevoir des contenus (Download) en général sur le port 21. Dans ce script PHP, nous allons voir comment échanger des fichiers avec un serveur FTP de la même manière qu'avec le logiciel FileZilla.

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.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
29/04/2016
Visualisation
vu 2133 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par mohammed dans java

Bonjour ,Merci pour ce travail ,juste j'ai une question pour ce qui concerne les textes avec les caracteres speciaux comment faire??

Publié par Mohamed dans java

Merci beaucoup j'ai eu un probleme de redimensionnement des images , mes images perdaient leur qualite, ta solution m'a aide pour ca mercii

Publié par Kachwahed dans CMS

Merci, ca marche avec moi, mais apès avoir changer:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HRes, VRes]);
par:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HorizRes, VertRes]); <...

Publié par roundge dans php5

Bien ! Merci pour cette petite classe en php bien pratique !
J'avais 2000 photos libres de droits à télécharger sur un site, dans un dossier ou les fichiers ne sont pas list&e...

Publié par Fobec dans logiciel

prise en charge du format ipV6. L'api est compatible avec tous les ip qu'elles soient au format ipV4 ou ipV6.