IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

ftp_get(c:/x/x/txt/.) failed to open stream: Permission denied


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut ftp_get(c:/x/x/txt/.) failed to open stream: Permission denied
    Bonjour,
    J'ai trouvé plusieurs discussions sur le sujet, essayé de nombreuses modifications, mais là, je sèche.
    Pourtant, la tâche semble facile à mettre en place : télécharger les fichiers d'un dossier FTP distant...avec ftp_get').
    Pas de problème sur la connexion ftp, j'arrive même à lister l'ensemble des fichiers de mon dossier FTP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    $ftp_server = "server.dns-orange.fr";
    $ftp_user_name = "username";
    $ftp_user_pass = "password";
    $remote_dir = "data";
    $local_dir = "c:/wamp64/www/txt/";
    $dir = opendir($local_dir);
     
    $conn_id = ftp_connect($ftp_server, 21) or die("Impossible de se connecter au serveur $ftp_server"); // Mise en place d'une connexion basique
     
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // Identification avec un nom d'utilisateur et un mot de passe
    ftp_pasv($conn_id, true);
    // Récupère la liste des fichiers du dossier FTP "data"
    $liste_fichiers = ftp_nlist($conn_id, $remote_dir);
    	foreach($liste_fichiers as $fichier)
    		{
    		echo $fichier;
     		echo "<br/>";
     		}
     
    closedir($dir);
    ftp_close($conn_id);
    ?>
    Mais lorsque je veux les télécharger avec ftp_get() :
    message d'erreur (Warning: ftp_get(c:/wamp64/www/txt/.): failed to open stream: Permission denied in C:\wamp64\www\hermes_ftp_get.php on line 26
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    $ftp_server = "server.dns-orange.fr";
    $ftp_user_name = "username";
    $ftp_user_pass = "password";
    $remote_dir = "data";
    $local_dir = "c:/wamp64/www/txt/";
    $dir = opendir($local_dir);
     
    $conn_id = ftp_connect($ftp_server, 21) or die("Impossible de se connecter au serveur $ftp_server"); // Mise en place d'une connexion basique
     
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // Identification avec un nom d'utilisateur et un mot de passe
    ftp_pasv($conn_id, true);
    // Récupère la liste des fichiers du dossier FTP "data"
    //ftp_chdir($conn_id, $remote_dir);
    $liste_fichiers = ftp_nlist($conn_id, $remote_dir);
    	foreach($liste_fichiers as $fichier)
    		{
    		if (ftp_get($conn_id, $local_dir.$fichier, $fichier, FTP_ASCII, 2)) //Téléchargement des fichiers dans le dossier local
    			{
     			echo "Ecriture des fichiers dans le dossier $local_dir réalisée avec succès\n";
    			}
    			else 
    				{
     				echo "Il y a un problème lors du téléchargement des fichiers depuis $remote_dir dans $local_dir\n";
     				echo "<br/>";
     				echo $local_dir.$fichier;
     				echo "<br/>";
     				}
    		}
     
    closedir($dir);
    ftp_close($conn_id);
    ?>
    Merci pour vos retours...

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    D'après le message d'erreur, on dirait que ton script essaye de télécharger le fichier ".".
    Or il s'agit d'un raccourcis pour dire "dossier courant" (tout comme ".." signifie "dossier parent").

    Dans ton script, essaye en vérifier que $fichier soit différent de "." et ".."

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($liste_fichiers as $fichier) {
        if ($fichier !== "." && fichier !== "..") {
            // Instructions du téléchargement
        }
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Bonjour darkstar123456,

    Merci pour ta réponse.
    Effectivement, ton "if" permet d'éliminer les "fichiers" "." et "..", mais cela ne résous pas le problème principal : je peux lister les fichiers, mais pas les télécharger.
    Je joins une image des erreurs pour chaque fichier, qui me semble être bien trouvé...
    Nom : Sans titre.jpg
Affichages : 1069
Taille : 440,5 Ko

  4. #4
    Membre émérite
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 812
    Par défaut
    Bonjour,
    As tu essayé de charger juste un seul fichier avec ftp_get?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Bonjour kabkab,

    Merci pour ta réponse, j'avais déjà essayé de ne télécharger qu'un seul fichier...avec le même résultat.

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Rebonjour,

    As-tu bien les droits sur tous les fichiers en question pour pouvoir les télécharger ?
    S'ils appartiennent (par exemple) à "root" et qu'ils sont en chmod 644, ça veut dire que tu ne peux pas les télécharger !

    Par contre, je testais ton code de mon côté et je suis tombé sur quelque chose de peut-être intéressant.
    A la ligne 28 ftp_get($conn_id, $local_dir.$fichier, $fichier, FTP_ASCII, 2)) ça ne semble pas (tout à fait) correct.
    D'ailleurs, il ne fonctionnait pas chez moi.

    Par contre, celui-ci fonctionne chez moi : if (ftp_get($conn_id, $local_dir . basename($fichier), $fichier)) {
    Comme tu peux le voir, j'ai utilisé basename() car ftp_get() ne crée pas les dossiers à la volée, or $fichier retourne le chemin absolu du fichier et pas uniquement son nom.
    J'ai également retiré les 2 derniers paramètres car j'avais des erreurs chez moi ^^

    Voici mon code de test (qui ne reprend que les fichiers .php et qui ne sont pas "index.php"):

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $local_dir = dirname(__FILE__) . '/';
     
    $conn_id = ftp_connect($ftp_host, 21);
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    ftp_pasv($conn_id, TRUE);
     
    $liste_fichiers = ftp_nlist($conn_id, $remote_dir);
     
     
    foreach ($liste_fichiers AS $fichier) {
        if (preg_match('#\.php$#', basename($fichier)) && basename($fichier) !== "index.php") {
            if (ftp_get($conn_id, $local_dir . basename($fichier), $fichier)) {
                echo PHP_EOL . '<pre>Transfert OK : ' . print_r(basename($fichier), true) . '</pre>' . PHP_EOL;
            } else {
                echo PHP_EOL . '<pre>Transfert PAS OK : ' . print_r(basename($fichier), true) . '</pre>' . PHP_EOL;
            }
        }
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    darkstar123456, j'ai bien pris en compte tes remarques : j'ai supprimé le 2 ligne 28 (il ne me servait qu'à démarrer le téléchargement au 3ème fichier, pour ne pas prendre "." et ".."), j'ai utilisé la fonction basename() même si je n'atais pas vraiment convaincu puisque le listing (1er script) me renvoyer les fichiers correctement ("trucmuche.txt" sans path).
    Malheureusement, j'ai toujours les mêmes erreurs...
    En ce qui concerne les droits, tous les fichiers à télécharger sont en chmod 777. En tout état de cause, j'arrive parfaitement à les récupérer (avec cet utilisateur, sur le dossier local du script) depuis filezilla...

  8. #8
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hello,

    C'est pas très safe le 777 mais bon, si c'est le cas (et qu'en plus tu as testé le user via un client FTP) c'est que les droits d'accès à ce niveau sont OK.
    Je me demande si ça ne pourrait pas être l'inverse à présent. C'est plus rare d'avoir ce genre de problèmes sur Windows mais.... sait-on jamais ?

    Est-ce que le dossier local où tu tentes de télécharger tes fichiers est un dossier qui a été créé manuellement ou via ton script ?
    Je ne vois pas de mkdir() et je pense qu'il serait bon que ça soit le script qui vérifie son existence et le créé initialement (pour être sûr que les droits soient OK pour le user).
    Quelque chose comme ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $local_dir = dirname(__FILE__) . '/txt/';
     
    if (!is_dir($local_dir)) {
        mkdir($local_dir, 0755, TRUE);
    }

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Bonjour,

    Effectivement darkstar123456, je m'étais aussi interrogé sur les droits d'accès du dossier local "txt" (sur W7 en effet). J'ai mis pour ce dossier la "sécurité" sur "contrôle total" pour "tout le monde" : toujours le même message.

    Warning: ftp_get(): User not allow in C:\wamp64\www\hermes_ftp_get_tests.php on line 32
    Avec ton script, le dossier est bien créé, mais toujours la même erreur (ceci dit, dans le manuel php il est dit : "mode" est ignoré sous Windows).

    Je me demande tout de même pourquoi le téléchargement est possible avec un client FTP mais pas avec "ftp_get"...
    Si tu as d'autres pistes je suis preneur...

  10. #10
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Je t'avoue que je suis un peu à court d'idées...

    As-tu essayé d’exécuter ton code depuis un serveur distant plutôt qu'en local.
    J'ai l'impression que les droits c'est parfois un peu chelou quand c'est sous Windows (alors que c'est typiquement un truc Unix dans sa définition)

    Si tu n'as pas la possibilité d'utiliser un serveur distant, peut-être peux-tu essayer WSL (Windows Subsystem for Linux)
    Cela permet d'avoir un terminal linux dans Windows.
    Tu pourrais alors installer PHP dans ce Linux et exécuter ton script depuis le terminal en tapant : php /chemin/vers/le/script/fichier.php
    PS : Pour "ouvrir" linux, il faut ouvrir une Invite de commande MS-DOS (Windows + R, taper "cmd" et faire Enter).
    Dans la fenêtre qui s'ouvrira, il suffit alors de taper bash

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    En suivant tes conseils, j'ai exécuté le code sur un serveur distant, cela ne fonctionne pas mieux, mais de nouvelles erreurs me font m'interroger sur le $local_dir.

    En effet, je me retrouve avec cette erreur :

    Warning: ftp_get(): User not allow in /storage/ssd2/201/11343201/public_html/hermes_ftp_get_tests.php on line 38
    ... et le dossier local "txt" est créer (avec toute l'arborescence) sur le serveur...

    De plus, quand je teste mon listing des fichiers, je l'ai ai tous, mais j'ai cette erreur au départ qui semble indiquer que le dossier "locl" est recherché sur le serveur...

    Warning: opendir(c:/wamp64/www/txt/): failed to open dir: No such file or directory in /storage/ssd2/201/11343201/public_html/hermes_ftp_listing.php on line 15

  12. #12
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Tu devrais définir ton $localDir de façon non statique, comme je l'ai fait.
    Ca permettrait d'être certain qu'il est correct (bon vu que tu fais le mkdir() ça devrait de toute façon être le cas.... ^^)

    Par contre, c'est bien ça ta nouvelle erreur (celle du listing), c'est qu'il essaye d'ouvrir ton dossier local (c:/wamp64/www/txt/) alors que tu es sur un serveur

Discussions similaires

  1. Fpdf erreur : failed to open stream: Permission non ACCORDÉE
    Par Etibru dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/02/2018, 17h17
  2. failed to open stream: Permission denied
    Par HEDDI dans le forum Langage
    Réponses: 1
    Dernier message: 31/07/2010, 01h45
  3. Réponses: 1
    Dernier message: 02/09/2007, 14h45
  4. [FTP] Erreur "failed to open stream"
    Par Nefret dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2005, 19h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo