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 3357 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Christof dans CMS

Je pense qu'il y a un problème au niveau de l'affectation du longint "Color" dans la
variable de type byte "r". A mon avis, cela risque de provoquer une erreur de
vé...

Publié par arthur dans java

essaye avec une while, cela devrais marcher. mais après je ne sais pas comment paramétrer. c'est toi qui voit

Publié par LMNP occasion dans logiciel

Bonjour,
Je me demandais si ce logiciel permet de trouver les Whois masques.
Merci de votre reponse.

Publié par Fobec dans CMS

Le code source de l'exemple se trouve dans la pièce jointe (Fiche de l'article -> Boutton Telecharger)

Publié par Helo dans java

SVP Comment faire fonctionner le bouton pause ?