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

Publié par robbie dans tuto

marche pas le code le la boite de confirmation
faut-il inclure: { dans le code ou les enlever? merci d'avance pour la reponse (si possible pas par mail merci)

Publié par amelia dans java

pour 30 sa donne 1346269

Publié par Axel dans java

merci Neoray pour ce commentaire
Effectivement, l'objet Calendar s'initialise sur l'heure GMT avec TimeZone.getTimeZone("UTC");
Calendar.getInstance(TimeZone.getTimeZone("...

Publié par Julie dans logiciel

C'est donc un moteur de recherche specialise. On peut vraiment rechercher tous les domaines que l'on veut. Cela permettrait aux gens de ne plus se faire arnaquer. Quelle bonne idee!

Publié par Patrice dans CMS

Concernant la commande ShellExecute :

Si vous voulez lancer un programme dont le nom est contenu dans une propriété text,
caption, items bref d\'un string ... n'oubliez pas de transfor...