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 :

upload de fichier : ça va trop vite la première fois [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 267
    Points : 3 892
    Points
    3 892
    Billets dans le blog
    1
    Par défaut upload de fichier : ça va trop vite la première fois
    Bonjour,
    dans mon code, y a un upload de fichier. Voici mon code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $currentDirectory = getcwd();  // getcwd — Retourne le dossier de travail courant
    $upload_dir = 'csv_upload';   // dossier où sera déplacé le fichier
    $name = $_FILES['file2']['name'];
     
    $filepath = ($currentDirectory .  DIRECTORY_SEPARATOR .  $upload_dir .  DIRECTORY_SEPARATOR .   $name);
     
    $tmp_file = $_FILES['file2']['tmp_name'];
     
    $did_upload = move_uploaded_file($tmp_file,  $filepath);
    if (!$did_upload) {
                DispMsg::dispMsg('Impossible to move the file in ' .     $upload_dir);
                exit();
    }
    Le souci est qu'entre le moment de la création de la variable $_FILES et son traitement, ça va trop vite, et du coup, message d'erreur :
    ( ! ) Warning: md5_file(C:\projets\ticket_rawsrc\csv_upload\test26-licences_avec_dq-date-us.csv): failed to open stream: No such file or directory in C:\projets\ticket_rawsrc\model\HashFile.php on line 22
    (Après l'upload, je hashe le fichier : $hash = md5_file ($this->filepath);)
    Si je fais une 2e fois l'upload du même fichier, le move_uploaded_file est effectué, et du coup, y a plus d'erreur.
    Comment faire, SVP, pour qu'il n'y ait pas d'erreur la première fois ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 627
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 627
    Points : 16 359
    Points
    16 359
    Par défaut
    Je ne pense pas que ce soit une question de vitesse : la 2e fois, ça fonctionne parce que le fichier a déjà été chargé dans le 1er traitement.
    Pourrait-on voir le reste du script (au moins jusqu'à l'endroit où ça plante), parce que là je ne vois pas bien d'où sort le $this->filepath...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 267
    Points : 3 892
    Points
    3 892
    Billets dans le blog
    1
    Par défaut
    Effectivement, j'avais supprimé une partie du code pour simplifier l'explication, mais le code complet est :
    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
    19
    $currentDirectory = getcwd();  // getcwd — Retourne le dossier de travail courant
    $upload_dir = 'csv_upload';   // dossier où sera déplacé le fichier
    $name = $_FILES['file2']['name'];
    $filepath = ($currentDirectory .  DIRECTORY_SEPARATOR .  $upload_dir .  DIRECTORY_SEPARATOR .   $name);
     
    $tmp_file = $_FILES['file2']['tmp_name'];
     
    $ref_HashFile = new HashFile($filepath);
     
    if ( $ref_HashFile->alreadyImported()) {
                DispMsg::dispMsg('Impossible to import the file because already in database');
                exit();
    }
     
    $did_upload = move_uploaded_file($tmp_file,  $filepath);
    if (!$did_upload) {
                DispMsg::dispMsg('Impossible to move the file in ' .     $upload_dir);
                exit();
    }
    et la méthode alreadyImported est :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function alreadyImported() : bool
    {
        $hash = md5_file ($this->filepath);
    etc
    Le message d'erreur porte sur la ligne 3 de alreadyImported.

    Le début de la classe est :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class HashFile
    {
     
        public $filepath;
     
        public function __construct($filepath) {
            $this->filepath = $filepath;
        }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 267
    Points : 3 892
    Points
    3 892
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Celira Voir le message
    la 2e fois, ça fonctionne parce que le fichier a déjà été chargé dans le 1er traitement.
    Ayant lu ça, j'ai pensé résoudre le problème en mettant plus tôt le upload :
    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
    19
    20
    21
    22
            $currentDirectory = getcwd();  // getcwd — Retourne le dossier de travail courant
            $upload_dir = 'csv_upload';   // dossier où sera déplacé le fichier
            $name = $_FILES['file2']['name'];
            $filepath = ($currentDirectory .  DIRECTORY_SEPARATOR .  $upload_dir .  DIRECTORY_SEPARATOR .   $name);
     
            $tmp_file = $_FILES['file2']['tmp_name'];
     
            $ref_HashFile = new HashFile($filepath);
     
            $did_upload = move_uploaded_file($tmp_file,  $filepath);
            if (!$did_upload) {
                DispMsg::dispMsg('Impossible to move the file in ' .     $upload_dir);
                exit();
            }
            else {
                $ref_HashFile->setFileHashedinBDD();
            }
     
            if ( $ref_HashFile->alreadyImported()) {
                DispMsg::dispMsg('Impossible to import the file because already in database');
                exit();
            }
    donc avant le hashage...Mais du coup, même si j'ai vidé juste avant la bdd, j'ai le message "Impossible to import the file because already in database" (de la ligne 20)

    D'ailleurs, normal, sachant que si l'upload est réussi, on appelle la méthode setFileHashedinBDD :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function setFileHashedinBDD():int
    {
        $hash = md5_file ($this->filepath); 
     
        $ppi = new PDOPlusPlus();
        $sql = <<<sql
    INSERT INTO `fichier_uploade` (`hash`) VALUES( {$ppi($hash)} )
    sql;
        $id = $ppi->insert($sql);
     
        return($id);
    }
    et donc le fichier sera vu comme déjà importé...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 627
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 627
    Points : 16 359
    Points
    16 359
    Par défaut
    Donc je résume le fonctionnement :
    - Tu envoies un fichier depuis le formulaire
    - Tu appelles la fonction isAlreadyImported qui a comme première action de faire quelque chose sur le fichier
    - Tu enregistres le fichier

    C'est normal que ça plante : tu fais quelque chose sur le fichier AVANT de l'enregistrer.

    Ajoute une étape dans ta fonction isAlreadyImported pour vérifier si le fichier existe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function alreadyImported() : bool
    {
        if (!file_exists ($this->filepath)) {
          // le fichier n'existe pas, pas besoin de le tester
          return false;
        } 
     
        $hash = md5_file ($this->filepath);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 267
    Points : 3 892
    Points
    3 892
    Billets dans le blog
    1
    Par défaut
    Je l'ai fait et effectivement, y a plus de message d'erreur. J'espère que c'est bon. Merci.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2018, 01h56
  2. Upload de fichiers sur un ftp
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 20/06/2004, 12h55
  3. message d'erreur : "le fichier verrou est trop importan
    Par lol_adele dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/06/2004, 08h58
  4. Upload de fichiers
    Par GDVL dans le forum ASP
    Réponses: 4
    Dernier message: 03/06/2004, 13h44
  5. Trop vite...
    Par olive-sjs dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/03/2004, 23h51

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