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 d'un fichier en POO [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut upload d'un fichier en POO
    Bonjour,

    ça fait plusieurs que je traine ce problème, mais comme je ne trouve pas de solution, je crée une discussion propre à cela.

    Ma démarche : j'ai une classe Ticket qui gère des fichiers CSV. J'ai créé dedans une méthode ticketUpload :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function ticketUpload()
    {
        $tic_upload=new CSVUpload();
        $tic_upload->csv_upload();
    }
    qui va donc chercher une méthode de la classe CSVUpload :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    <?php
    namespace Classes\Olivier;
    use vendor\PhpEcho\PhpEcho;
    use Classes\CSVParser;
     
    class CSVUpload
    {
    public function __construct()
    {}
    public function csv_upload()
    {
    $this->formCsvARMToDb();
     
    // contrôle du fichier transmis
    if (isset($_POST['submitfile1'])) { 
        $info =  pathinfo($_FILES['file1']['name'], PATHINFO_EXTENSION);
        if ($info !== 'csv') {
            $body = new PhpEcho();
            $body->setCode('<p>This file is not a .csv file</p>');
            echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
            exit;
        }
        else
        {
            $body = new PhpEcho('', ['msg_end' => $_FILES['file1']['name']." is uploaded, start processing."]);
            $body->setCode('<p>'.$body('msg_end').'<br></p>');
            echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
     
            // fichier ok, parsage
            $csv_parser = new CSVParser($_FILES['file1']);
            if ($csv_parser->parse()) {
                    $body = new PhpEcho('', ['msg_end' => $_FILES['file1']['name']." fully processed, without errors."]);
                    $body->setCode('<p>'.$body('msg_end').'</p>');
                    echo $body;
            } 
            else
            {
                    // traitement des erreurs remontées par le parser
            }
        } 
     /*   else 
        {
        // aucun fichier transmis
        }*/
    }//fin de if (isset($_POST['submitfile1'])
    else echo "pas de \$_POST<br/>";
    }//end csv_upload
     
    public function formCsvARMToDb()
    { 
        $page = new PhpEcho([DIR_ROOT, 'view Layout.php']);
     
        $body = new PhpEcho([DIR_ROOT, 'view formCsvARMToDb.php'], []);
        $page['body'] = $body;
     
        // on renvoie au navigateur la page assemblée
        echo $page;
    }
     
    }
    ?>
    Pour l'affichage des vues html, j'utilise la classe PhpEcho de rawsrc.
    Mon souci est que dans la méthode CSVUpload, contrairement à ce que j'espérais, la variable $_POST n'existe pas (on passe dans le else de la ligne 47). Donc comment faut-il s'y prendre ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par laurentSc Voir le message
    la variable $_POST n'existe pas
    Tu ne peux pas dire ça : ce n'est pas $_POST qui n'existe pas c'est $_POST['submitfile1'] qui n'existe pas, ce n'est pas du tout pareil.
    $_POST est TOUJOURS défini, après pour ce qui est de son contenu c'est fonction du code.

    Tu dois décomposer ton code qui fait un peu tout.
    Tu dois avoir une classe Upload qui ne fait que gérer l'envoi de fichier, ensuite une classe CSVFile qui s'assure que ton fichier est conforme à ce que tu attends et enfin une classe Ticket qui utilise tout ça pour faire ce qui est attendu.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. Même si je mets beaucoup de temps, ça m'a fait penser à faire un var_dump($_POST); et constater que...c'est $_POST['submitfile2'] qui existe !

    Je décompose en plusieurs classes et je reviendrai quand j'aurai quelque chose.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Voilà le boulot :
    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
     
    $CSV_file1=new CSVUpload();
    $CSV_file1->formCsvARMToDb();
    $CSV_file_check1=new CSVFile();
    $CSV_file_check1->checkFile();
    $csv_parser = new CSVParser($_FILES['file2']);
           if ($csv_parser->parse($_FILES['file2'])) {
                   $body = new PhpEcho('', ['msg_end' => $_FILES['file2']['name']." fully processed, without errors."]);
                   $body->setCode('<p>'.$body('msg_end').'</p>');
                   echo $body;
           } 
           else
           {
                   // traitement des erreurs remontées par le parser
           }

    CSVUpload.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <?php
    namespace Classes\Olivier;
    use vendor\PhpEcho\PhpEcho;
    use Classes\CSVParser;
     
    class CSVUpload
    {
    public function __construct()
    {}
     
    // méthode pour uploader un fichier csv depuis le disque dur
    // véfication du type de fichier (c'est bien un csv)
    public function csv_upload()
    {
    $this->formCsvARMToDb();
     
     
    }//end csv_upload
     
    public function formCsvARMToDb()
    { 
        $page = new PhpEcho([DIR_ROOT, 'view Layout.php']);
     
        $body = new PhpEcho([DIR_ROOT, 'view formCsvARMToDb.php'], []);
        $page['body'] = $body;
     
        // on renvoie au navigateur la page assemblée
        echo $page;
    }
     
    }
    ?>
    CSVFile.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <?php
    namespace Classes\Olivier;
    use DateTime;
    use vendor\PhpEcho\PhpEcho;
    use vendor\rawsrc\Request;
    use Classes\MYPDO;    //to use class MYPDO 
     
    class CSVFile
    {
       /* Constructor */
    public function __construct()
    {
     
    }
     
    public function checkFile()
    {
       // contrôle du fichier transmis
    if (isset($_POST['submitfile2'])) { 
       $info =  pathinfo($_FILES['file2']['name'], PATHINFO_EXTENSION);
       if ($info !== 'csv') {
           $body = new PhpEcho();
           $body->setCode('<p>This file is not a .csv file</p>');
           echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
           exit;
       }
       else
       {
           $body = new PhpEcho('', ['msg_end' => $_FILES['file2']['name']." is uploaded, start processing."]);
           $body->setCode('<p>'.$body('msg_end').'<br></p>');
           echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
     
       } 
    /*   else 
       {
       // aucun fichier transmis
       }*/
    }//fin de if (isset($_POST['submitfile2'])
    else echo "pas de \$_POST['submitfile2']<br/>";
    }
     
     
    } //end class CSVFile

    CSVParser.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    <?php
    namespace Classes\Olivier;
    use DateTime;
    use vendor\PhpEcho\PhpEcho;
    use vendor\rawsrc\Request;
    use Classes\MYPDO;    //to use class MYPDO 
     
    class CSVParser
    {
    private $sep;
     
       /* Constructor */
    public function __construct()
    {
     
    }   // end __construct
     
    public function parse($file)
    {
    // to convert priority to integer
    function priorityToInt($priority) {
        switch($priority) {
            case "Low" : return(0); break;
            case "Medium" : return(1); break;
            case "High" : return(2); break;
            default : return(0); break;
        }
    }
     
    // to convert status to integer
    function statusToInt($status) {
        switch($status) {
            case "Assigned"  : return(0); break;
            case "Cancelled" : return(1); break;
            case "Closed" : return(2); break;
            case "In Progressed" : return(3); break;
            case "Pending" : return(4); break;
            case "Resolved" : return(5); break;
            default : return(0); break;
        }
    }
     
    //to convert the date into SQL format : YYYY-MM-DD HH:MM:SS
    function convertDate($olddate) {echo "csvWrite 58 olddate=".$olddate."<br/>";
        list($date,$heure)=explode(' ',$olddate);
        list($jour,$mois,$annee)=explode('/',$date);
        $newdate=date('Y-m-d',mktime(0,0,0,$mois,$jour,$annee));
        $newdate=implode([$newdate,' ',$heure]);
        return($newdate);
    }
     
    function getDateSql($date) {
        // possible formats : M d, Y ou M d Y ou M d ou M-d
            $date1 = \DateTime::createFromFormat('M d, Y', $date);
            if ($date1==false) {$date1=\DateTime::createFromFormat('M d Y', $date);}
            if ($date1==false) {
                {$date1=\DateTime::createFromFormat('M d', $date);}
                if ($date1==false) {$date1=\DateTime::createFromFormat('M-d', $date);}
                }
             if ($date1!=false) return( $date1->format('Y-m-d H:i:s'));
             else return(false);
        }
     
          //to suppress the substring "SESA"
        function SuppSESA($val) {
        return(substr($val,4)); // to return $val, starting from pos 4 (5th character)
        }    
    // deb of code    
      if (isset($_FILES['file2']))
         if (!$_FILES['file2']["error"]) {
                $upload_dir = 'csv';
                $name=$_FILES['file2']['name'];
     
                if ( false === $handle = fopen(DIR_ROOT.$upload_dir.DIRECTORY_SEPARATOR.$name, 'r') )
                    throw new Exception("impossible to open the file '$name'");
     
                // one reads the header
                $buffer = 4096;
     
                if ( false === ($header = fgets($handle, $buffer)) )
                    throw new Exception("The file '$name' is empty");
     
                // one tests different separators
                $this->sep = ','; // by default
                $separators = [',', ';'];
     
                foreach ($separators as $separator) {
                    if ( strpos($header, $separator)> 0) { 
                        $this->sep = $separator;
                        break;
                    }
                }   // end foreach
     
                    //Remove UTF8 Bom
                function removeUtf8Bom($text)
                {
                    $bom = pack('H*','EFBBBF');
                    $text = preg_replace("/^$bom/", '', $text);
                    return $text;
                }
     
                $header = removeUtf8Bom($header);
     
                $deb_header=substr($header,0,6);
     
                // returns true if $needle is a substring of $haystack
                function contains($needle, $haystack)
                {
                    return strpos($haystack, $needle) !== false;
                }
     
                if (!contains("SESA",$deb_header))
                {
                    $body = new PhpEcho('', ['msg_error' => "this file is not a licence"]);
                    $body->setCode('<p>'.nl2br($body('msg_error')).'<br></p>');
                    echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
                    exit;
                }
     
                $content_csv=[];
                // the function fgetcsv reads one line of the csv file and each value is put in the array $fields, knowing the delimiter $rep
                while (false !== ($fields = fgetcsv($handle, $buffer, $this->sep)) ) {                
                    //var_dump($fields);
                    $fields=str_replace('"','',$fields);
                    //var_dump($fields);
                    if ($this->sep == ","){//as the code is correct in the case where the date is in a unique line, one puts in that case
                        $fields[8] = isset($fields[8]) ? ($fields[8].",".$fields[9]) : '';
                    }
                    $fields[8]=getDateSql($fields[8]);
     
                    $fields[0]=SuppSESA($fields[0]);   //to suppress the substring "SESA"        
     
                    $nb_cell_line=sizeof($fields);$val="";
                    // the shift depends on the separator
                    switch($this->sep) 
                    {
                        case ';' : 
                            $no_id_to_register=[0,5,8,11,17,18,19]; break;
                        case ',' : 
                            $no_id_to_register=[0,5,8,12,18,19,20]; break;
                        default : break;
                    }
     
     
                    for ($i=0;$i<$nb_cell_line;$i++) {
                        //suppress some colons from the registration 
                        if (in_array($i,$no_id_to_register)) {$val.=$fields[$i].'","';} //some cells of the array are concatenated to make a string 
                    }
                    $content_csv[] = substr($val, 0, -2);              //one suppresses the last 2 elements of the string 
     
            }   // end of while
    }  // end if (!$=FILES['file2']["error"])
    return($content_csv);
    }  // end of parse
     
    } //end class CSVParser

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Si ca peut t'aider à comprendre/améliorer des choses , voici le code d'une classe d'upload que j'utilise régulièrement.
    Ca fait partit de mon framework donc pas utilisable directement comme ça , mais ca fait un peu de lecture

    https://github.com/grunk/Pry/blob/ma...ile/Upload.php

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci pour ça. J'ai récupéré le code sur GitHub, mais pour l'étudier, je compte voir ce qu'il produit, et j'ai pas trouvé comment le lancer...

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Tu as un ensemble de sample ici : https://github.com/grunk/Pry/tree/master/samples
    ET un particulier sur l'upload ici : https://github.com/grunk/Pry/blob/ma...ple_upload.php je l'ai pas retester depuis pas mal d'année donc c'est pas impossible que ca marche pas directement.
    C'est un framework interne , qui n'a pas forcément de vocation public et n'est donc pas très documenté

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

Discussions similaires

  1. [Upload] Droits des fichiers
    Par flexx dans le forum Langage
    Réponses: 7
    Dernier message: 01/12/2005, 20h14
  2. [Upload] telecherger un fichier
    Par fraizas dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2005, 17h35
  3. Réponses: 6
    Dernier message: 06/10/2005, 21h54
  4. [Servlet][Tomcat] Upload d'un fichier sur le serveur
    Par gandalf_le_blanc dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 19/04/2004, 14h56

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