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 :

Transfert de fichier par PHP


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Transfert de fichier par PHP
    Bonjour,

    Je viens aujourd'hui vers vous car je souhaite exécuter un script PHP depuis un hébergement web.

    Actuellement mon script ce lance et fonctionne correctement sur Wamp (en local) mais ne fonctionne pas dés qu'il est lancé depuis l'hébergement (Hébergeur Hosteur).

    Voici mon script :

    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
     
    <?php
     
    $serveur = 'lienserveur';
    $login = 'login';
    $mot_de_passe = 'Mdp';
     
    $source = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output';
    $dst = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output/Prod_Order';
     
       $open = opendir('ftp://login:mdp@serveur/Prod_Output');
     
            while( ($file = readdir($open)) !== false) {
                if(strstr($file, '.txt') && preg_match (" /^O/i ", $file)) {
                     $files = $file; {
     
                    is_dir($source . '/' . $files);
     
                     if  (copy($source . '/' . $files, $dst . '/' . $files)){
     
    				  echo "Transfert reussi...\n";} else { echo "Transfert echoue...\n";}
     
     
    				 }
     
                }
            }
            closedir($open);
     
    ?>
    Y a t'il une erreur que le serveur n'accepte pas ?
    l'erreur actuelle est
    readdir() expects parameter 1 to be resource, boolean given in /var/www/vhosts/chemin/du/fichier.php
    l'erreur ce trouve la où est $files = $file;

    Les droits d'exécutions sont sur 755.

    Versions used ______________________
    Apache 2.4.39 - PHP 7.2.18
    MySQL 5.7.26
    MariaDB 10.3.14
    PHP 5.6.40 for CLI (Command-Line Interface)

    En espérant vous avoir données assez d'informations pour m'aider.
    En vous remerciant d'avance.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 700
    Points : 43 778
    Points
    43 778
    Par défaut
    opendir n'est pas fait pour ouvrir un dossier ftp, mais un dossier local. Par ailleurs, il faut tester le retour de ce type de fonction pour voir si elle n'a pas échouée.

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci de m'avoir répondu aussi rapidement.

    Grâce à vous j'ai retiré la plupart des erreurs.

    J'ai changé le code et voilà ce que cela donne maintenant :

    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
    34
     
     
    $serveur = 'lienserveur';
    $login = 'login';
    $mot_de_passe = 'mdp';
     
     
    $source = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output';
    $dst = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output/Prod_Order';
     
    if ($conn_id = ftp_connect($serveur))
    { echo "Serveur OK\n";}
     
     
    if ($login_result = ftp_login($conn_id, $login, $mot_de_passe)) 
    { echo "Connexion reussi\n";}
     
     
     
    		while($file = ftp_nlist($conn_id, "./Prod_Output") !== false);
    		var_dump($file); {
     
     
     
                    is_dir($source . '/' . $file);
     
                     if  (copy($source . '/' . $file, $dst . '/' . $file)){
     
    				  echo "Transfert reussi...\n";} else { echo "Transfert echoue...\n";}
     
     
                }
     
    		ftp_close($conn_id);
    Et voici ce que j'ai quand j'exécute le script depuis le serveur :

    Serveur OK
    Connexion reussi
    bool(false)

    $file est vide alors qu'il devrais contenir la liste des fichiers.
    Comment puis-je faire pour régler ce problème ? est-ce le chemin qui est inexacte ?

    Merci,

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 894
    Points : 6 648
    Points
    6 648
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($file = ftp_nlist($conn_id, "./Prod_Output") !== false);
    		var_dump($file); {
     
                            is_dir($source . '/' . $file);
    Ici, Il n'y a pas de raison d'utiliser une boucle while. La fonction ftp_nlist() renvoie directement un tableau avec le contenu du répertoire.

    D'autre part lorsque tu veux faire une affectation dans un test, pour une question de priorité des opérateurs (ordre dans lequel PHP évalue les différents opérateurs d'une expression), tu dois l'écrire de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( false !== $truc = machin($bidule) ) { /*...*/ }
    ou alors ajoute des parenthèses pour forcer l'ordre d'évaluation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($truc = machin($bidule)) !== false ) { /*...*/ }
    car en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $truc = machin($bidule) !== false ) { /*...*/ }
    $truc contiendra le résultat de la comparaison entre machin($bidule) et false.

    Comme tu as mis un ; immédiatement après ton test while, la fonction ftp_nlist est exécutée indéfiniment jusqu'à ce que le serveur ftp t'envoie boulé.

    Tu ne peux pas utiliser is_dir qui va chercher le chemin que tu lui fournies localement et pas sur le ftp. En plus en dehors d'un test ou d'une affectation, cette fonction ne sert à rien.

    Pour vérifier qu'il s'agit bien d'un fichier, tu pourrais utiliser ftp_mlsd() à la place de ftp_nlist(), ce qui te donnera pour chaque entrée un tableau contenant toutes ses caractéristiques dont le type.

  5. #5
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour CosmoKnacki,

    Merci de votre réponse, mais le problème persiste.

    Le ftp_mlsd ne fonctionne pas du tout : Fatal error: Call to undefined function ftp_mlsd()

    J'ai modifié le bout de code qui pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $file = ftp_nlist($conn_id, "./Prod_Output/*.txt")
    		 { 
     
                     if  (copy($source . '/' . $file, $dst . '/' . $file)){
     
    				  echo "Transfert reussi...\n";} else { echo "Transfert echoue...\n";}     
     
    		}    
     
    		ftp_close($conn_id);
    Le problème c'est que même en modifiant le code dans tous les sens, je n'arrive pas à retourner la liste des fichiers dans le dossier spécifique.

    Je ne vois pas d'où viens le blocage.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 894
    Points : 6 648
    Points
    6 648
    Par défaut
    Il te faut travailler avec une version de PHP à jour (>=7.3), car la fonction ftp_mlsd() c'est minimum 7.2.

    En ce qui concerne, ton code modifié, regarde un peu le manuel PHP, ftp_nlist() renvoie un tableau. donc écrire '/' . $file n'a pas de sens.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 700
    Points : 43 778
    Points
    43 778
    Par défaut
    Autre point : pourquoi utilise tu ftp ? données sur site distants ? Si les données sont sur la même machine, exemple site web sur un mutualisé, tu te facilitera la vie en utilisant opendir mais avec un chemin local, pas en ftp.

  8. #8
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Le problème à l'heure actuelle c'est que les fichiers que je veux gérer (ranger dans des dossiers différent de celui où les fichiers arrivent) est sur un FTP distant,
    et non gérable.

    A la base je les fait sur mon PC avec Wamp et cela fonctionne correctement mais là je suis obligé de le faire sur un serveur qui tourne H24, car je ne peux le faire de chez moi H24.

    Voilà pourquoi je souhaite faire un code qui lis les fichiers et les copies sur un dossier différent, d'où le opendir que j'ai changé en ftp_nlist et même ftp_rawlist.

    J'ai beau mettre n'importe lequel cela me renvoi des données vide alors que j'ai 10 fichiers txt sur le FTP distant.

    C'est aussi pour cela que j'ai fourni le code suivant qui appel les dossiers source et destination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $serveur = 'lienserveur';
    $login = 'login';
    $mot_de_passe = 'mdp';
     
     
    $source = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output';
    $dst = 'ftp://'.$login.':'.$mot_de_passe.'@'.$serveur. '/Prod_Output/Prod_Order';
    Là pour le moment je souhaite juste que "bool(false)" devienne une liste de fichier. Ensuite je m'attaquerais à la copie des fichiers.

    Pour le moment j'ai n'ai plus que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if ($conn_id = ftp_connect($serveur, 21)){ echo "Serveur OK\n";}
     
    /* Identification avec un nom d'utilisateur et un mot de passe */
    if ($login_result = ftp_login($conn_id, $login, $mot_de_passe)) { echo "Connexion reussi\n";}
     
     
    		ftp_chdir($conn_id, $dir);	
     
    		$file = ftp_rawlist($conn_id, ".");
     
    		var_dump($file);  
     
    		ftp_close($conn_id);
    Cela m'affiche : Serveur OK Connexion reussi bool(false)
    et rien d'autre. ($dir est le dossier cible "Prod_Output")

Discussions similaires

  1. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  2. Transfert de fichier par FTP
    Par 12_darte_12 dans le forum Access
    Réponses: 1
    Dernier message: 05/09/2006, 09h26
  3. transfert de fichier par method post
    Par firejocker dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 13h44
  4. Transfert de fichiers par sockets
    Par Kaori dans le forum C++
    Réponses: 19
    Dernier message: 26/01/2005, 13h58
  5. Transfert de fichier par ftp
    Par schub1015 dans le forum MFC
    Réponses: 3
    Dernier message: 14/01/2004, 17h53

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