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

Publié par dotnet dans php5

Cette interface est intéressant par le fait qu'elle soit universelle, donc son intérêt pour moi est qu'elle permet l'accès aux bases de données Microsoft SQL Server....

Publié par Altair dans tuto

Bonjour, cette solution fonctionne-t-elle également sur les serveurs mutualisés Amen svp ?

Publié par Tactic Rayan dans java

Merci beaucoup, c'est tres interressent, tres longtemps que j'ai recherche ce code

Publié par Fobec dans news

Bonjour,
la localisation des adresses ip utilise plusieurs algo de recherche de position geographique. La precision du rapport d'analyse correspond la qualite de la localisation:
9/10 la locali...

Publié par Daxentuut dans java

Avec les imports c'est mieux :

import java.awt.AWTException
import java.awt.Robot
import java.awt.event.KeyEvent
import java.io.IOException
import java.util.logging.Level
import...