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 fichiers en PHP


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Upload de fichiers en PHP
    Bonjour à tous,
    Merci de m'accorder quelques minutes conçernant un problème dans mon code que je n'arrive vraiment pas à résoudre.

    En fait, je dispose d'un système d'upload de fichiers sur une page appelée add_files.php.
    Sur cette page, il y a un formulaire grâce auquel le visiteur choisit son fichier ainsi que le dossier de destination de son fichier (parmi tous les dossiers présents dans le dossier parent "images/") :

    images/
    dossier1/
    dossier2/

    etc...

    Le problème arrive ensuite lors du traitement PHP :
    lorsque j'upoad des fichiers .pdf, .txt, tout va bien, mais je souhaiterais que le visieur ne puisse uploader que des images. Or, algré l'absence de restrictions d'extensions dans mon traitement, l'upload ne se fait pas pour les fichiers images mais se déroule correctement pour les fichiers .txt/.pdf comme je vous le disais précédemment.

    Pouvez-vous m'éclairer ?

    Voici tout d'abord mon code d'upload (présent sur la même page que mon formulaire) :

    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
    <?php
     
      function upload($index,$destination,$maxsize=FALSE,$extensions=FALSE)
      {
         //Test1: fichier correctement uploadé
           if (!isset($_FILES[$index]) OR $_FILES[$index]['error'] > 0) return FALSE;
         //Test2: taille limite
           if ($maxsize !== FALSE AND $_FILES[$index]['size'] > $maxsize) return FALSE;
         //Test3: extension
           $ext = substr(strrchr($_FILES[$index]['name'],'.'),1);
           if ($extensions !== FALSE AND !in_array($ext,$extensions)) return FALSE;
         //Déplacement
           return move_uploaded_file($_FILES[$index]['tmp_name'],$destination);
      }
    $msg = '';
    if(isset($_POST['submit'])) {
      $upload1 = upload('fichier','../images/'.$_POST['dir_choice'].'/'.$_FILES['fichier']['name'].'',FALSE, FALSE );
      if($upload1) {
        $msg = "Upload réussi.";
      } else {
        $msg = 'ko';
      }
    }
    ?>
    Voilà ensuite le code de mon formulaire :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <form method="post" enctype="multipart/form-data">
        <div class="controls">
            <label>Sélectionnez le fichier que vous souhaitez envoyer sur le serveur</label>
            <input type="file" name="fichier"/>
        </div><br />
        <div class="controls">
            <label>Dossier de destination</label>
            <select class="btn-group" name="dir_choice" data-toggle="buttons">
            <?php 
            function list_dir($name) {
                if($dir = opendir($name)) {
                    while(($file = readdir($dir)) !== false) {
                        if($file != '.' && $file != '..') {
                            if(!ereg(".jpg", $file) && !ereg(".JPG", $file) && !ereg(".bmp", $file) && !ereg(".BMP", $file) && !ereg(".png", $file) && !ereg(".PNG", $file) && !ereg(".css", $file) && !ereg(".php", $file) && !ereg(".html", $file) && !ereg(".sql", $file) && !ereg(".txt", $file) && !ereg(".cmd", $file)) {
                                    echo '<option type="radio" value="'.$file.'">'.$file.'</option>';
                              }
                         }
                   }
                   closedir($dir);
                }
            }
            $dir = "../images/";
            if(is_dir($dir)) {
                if($dh = opendir($dir)) {
                    while(($file = readdir($dh)) !== false) {
                        if($file != '.' && $file != '..') {
                            if(!ereg(".jpg", $file) && !ereg(".JPG", $file) && !ereg(".bmp", $file) && !ereg(".BMP", $file) && !ereg(".png", $file) && !ereg(".PNG", $file) && !ereg(".css", $file) && !ereg(".php", $file) && !ereg(".html", $file) && !ereg(".sql", $file) && !ereg(".txt", $file) && !ereg(".cmd", $file)) {
                                echo '<option type="radio" value="'.$file.'">'.$file.'</option>';
                                echo list_dir($file);
                            }
                        }
                    }
                    closedir($dh);
                }
            } else { echo "Le dossier ".$dir." est introuvable"; }
            ?>
            </select>
        </div><br />
        <div class="controls">
            <input type="submit" class="btn btn-primary" name="submit" value="Ajouter au serveur" />
            <?= $msg ?>
        </div>                             
    </form>
    J'en profite par ailleurs pour vous demander si il est possible de lister les dossiers présents dans les sous-dossiers de mon dossier images/ ?
    Ex :
    images/
    dossier1/
    dossier2/
    sous-dossier1/
    dossier3/

    Actuellement, seuls les sous-dossiers directs du dossiers parent (dossier1, dossier2, dossier3) ne s'affichent dans ma liste de séléection. Comment afficher leurs sous-dossiers .

    Je vous remercie par avance !!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- à lire :

    2- Pour l'extension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	// -------------------------------------
    	// extension du fichier uploadé (en minuscule)
    	$file_Extension 		= strtolower(pathinfo($_FILES['newsPhoto']['name'],PATHINFO_EXTENSION));
    On peut aussi vérifie le type MIME réel du fichier.

    3-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                            if(!ereg(".jpg", $file) && !ereg(".JPG", $file) && !ereg(".bmp", $file) && !ereg(".BMP", $file) && !ereg(".png", $file) && !ereg(".PNG", $file) && !ereg(".css", $file) && !ereg(".php", $file) && !ereg(".html", $file) && !ereg(".sql", $file) && !ereg(".txt", $file) && !ereg(".cmd", $file)) {
                                    echo '<option type="radio" value="'.$file.'">'.$file.'</option>';
                              }
    Tu n'as pas trouvé mieux ??
    De plus, ereg() est obsolète...

    4- à lire : Créer un explorateur de dossier PHP

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Le type mime et l'extension ne sont pas des vérifications valables pour sécuriser un upload d'image puisque ce sont des informations usurpable facilement.

    La seul vraie solution est d'essayer de traiter le fichier après son envoi avec une fonction d'image. Par exemple getimagesize() est un bon candidat; Si ca retourne false ou qu'une erreur survient c'est que le fichier n'est probablement pas une image.
    Pour finir il faudra prendre soin de placer les uploads dans des dossiers non accessible aux utilisateurs (hors racine web).
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Upload] Upload de fichier réception PHP coté serveur
    Par Watier_53 dans le forum Langage
    Réponses: 4
    Dernier message: 10/03/2008, 10h53
  2. [Upload] upload un fichier en php
    Par isselmoumg dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2008, 15h52
  3. Upload de Fichier pour PHP processing
    Par lekunfry dans le forum Flex
    Réponses: 1
    Dernier message: 05/12/2007, 11h52
  4. [FTP] upload de fichiers via PHP
    Par r-zo dans le forum Langage
    Réponses: 7
    Dernier message: 02/01/2006, 15h29

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