Récupérer un dossier entier en FTP

4lO5AN
Invité n'ayant pas de compte PHPfrance

01 mai 2014, 22:48

Bonsoir,

Je cherche depuis plusieurs heures maintenant quelque chose qui me semble pourtant basique.

En php je souhaite me connecter en ftp et récupérer en local un dossier avec ses sous répertoire et ses fichiers.

J'ai épuisé beaucoup de forum sans résultat. Ma connexion ftp fonctionne et en voici le code :
//récupère mes id de connexion
list ($ftp_server,$port,$ftp_user_name,$ftp_user_pass) =  ftpConf();
 
 
    // Mise en place dune connexion basique
    $conn_id = ftp_connect($ftp_server);
      
    // Identification avec un nom dutilisateur et un mot de passe
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
      
  
    // Vérification de la connexion
    if ((!$conn_id) || (!$login_result) || (!$mode)) {
            echo "La connexion FTP a échoué !";
 
    } else {
            echo "Connexion au serveur $ftp_server, pour l'utilisateur $ftp_user_name";
        }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 mai 2014, 23:06

salut,

un sujet récent parle aussi de FTP et te fournit des pistes pour faire ce que tu souhaite php-debutant/lenteurs-scan-ftp-t270993.html

merci d'utiliser le formulaire de recherche du forum :mrgreen:

@+
Il en faut peu pour être heureux ......

4lO5AN
Invité n'ayant pas de compte PHPfrance

01 mai 2014, 23:22

Merci moogli mais cela ne résous pas mon problème.

Ce code liste seulement les fichiers dans le dossier principal. Mon but étant de copier tous les sous-dossier ainsi que les fichiers à l’intérieur.
Apres cela je pourrais faire ma copie.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 mai 2014, 00:59

et tu ne sais pas faire une fonction récursive ?

la suite ce fait avec ftp_get

commence par lire le contenu du répertoire distant et après tu pourras faire la copie.

@+
Il en faut peu pour être heureux ......

4lO5AN
Invité n'ayant pas de compte PHPfrance

02 mai 2014, 09:40

Oui je comprend ou tu veux en venir avec la récursivité .

Mais qu'est-ce qui me permet de lister des dossiers ?

ftp_nlist me liste seulement les fichiers
ftp_get me 'télécharge' seulement les fichiers

Avec quel méthode parcourir mon dossier global ? Et quelle méthode me permet de vérifier si c'est un dossier ou non ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 mai 2014, 10:22

is_dir permet de savoir s'il s'agit d'un dossier, et utilisable avec ftp

sinon ftp_raw_list tu fournira plus de détails mais faut parser le retour (si commecne par un d c'est un répertoire, par l un lien symbolique, - un fichier).

pour la récursivité, c'est a toi de la gérer en fonction de si c'est un répertoire ou pas.
ftp_rawlist gère la chose avec le 3ème paramètre.

@+
Il en faut peu pour être heureux ......

4lO5AN
Invité n'ayant pas de compte PHPfrance

02 mai 2014, 12:13

Merci de tes réponses moogli

J'ai fait quelque chose comme cela mais ma page tourne en boucle


// Mise en place d'une connexion basique
$connexion = ftp_connect($ftp_server, $port, 2);


// Authentification & Vérification FTP
if (@ftp_login($connexion, $ftp_user_name, $ftp_user_pass)) {
        
        echo "<div align='right' class='details'>Connecté\n</div>";

        // Activation du mode passif
        ftp_pasv($connexion, true);

        $src = $connexion;
        $dst = "test/";

        recurse_copy($src,$dst);

        // Fermeture de la connexion
        ftp_close($connexion);


// Affichage si pas de connexion possible
} else {
        echo "<div align='center'><span class='rouge'>Connexion impossible au serveur privé de l'association <strong>WDA</strong>.<br /><br />Veuillez nous en excuser et réessayez SVP ultérieurement.\n</span></div><br />";
}


ftp_close($conn_id);



    function recurse_copy($src,$dst) {

        $dir = opendir($src);
        @mkdir($dst);

        while(false !== ( $file = readdir($dir)) ) {
            if (( $file != '.' ) && ( $file != '..' )) {

                if ( is_dir($src . '/' . $file) ) {

                    recurse_copy($src . '/' . $file,$dst . '/' . $file);
                }

             else {
                copy($src . '/' . $file,$dst . '/' . $file);
             }

            }
        }
        closedir($dir);
    }






Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 mai 2014, 22:35

salut,

vire les @ c'est moche et inutile en dev (et en prod on n'affiche pas les erreurs donc aucun intérêt ;).


as tu tenté un débug avec ton ide préféré ?
le but étant d'être certain de ce que fait ta fonction (pas de boucle infinie sur le while, que tu passe bien les donne infos quand tu ré emploi la fonction récusive etc.

opendir prend en paramètre une chaîne de caractère et non une ressource de connexion.

si tu veux indiquer utilisateur et mot de passe avec opendir :
<?php
$dir = opendir('ftp://user:[email protected]');
en debug tu pourras voir ce que contient $dir.

@+
Il en faut peu pour être heureux ......

4lO5AN
Invité n'ayant pas de compte PHPfrance

03 mai 2014, 13:54

Merci moogli j'ai pu avancer grâce à toi !

Je mettrais le code complet une fois que tout sera au point !

4lO5AN
Invité n'ayant pas de compte PHPfrance

17 mai 2014, 16:37

Mon sujet est résolue !

Le code de dessus marche parfaitement il s'agissait d'un problème de droit d’accès aux dossiers.
En effet je travaille pour un prestataire et donc je n'ai pas pensez à cela ! Dépité....