Uploadeur de fichiers multiples v1

Soyez le premier à donner votre avis sur cette source.

Vue 9 382 fois - Téléchargée 1 691 fois

Description

UPLOADEUR DE FICHIERS MULTIPLES

- choix des extensions dans un tableau
- contrôle des erreurs
- extensible, ajout de 'file' dans le formulaire par la variable $j
- quelques contrôles de sécurité et nettoyage
- adaptable à differents projets
- creation auto du repertoire upload
- ideal pour le téléchargement d'images vers une galerie

Source / Exemple :

<?php
$rep = 'upload';/* vous decider */
if (@file_exists($rep)){
}else{
@mkdir($rep, 0705);
}

/*reglages persos*/
$j=5; /*indiquer ici le nombre de input file, faut pas exagerer les copains ...*/
$size_max=250000; /*taille maxi du fichier*/
$extensions = array('.png', '.gif', '.jpg', '.jpeg'); /*ici des images*/
/*attention repercuter la liste dans le controle mine plus bas*/

if(isset($_FILES['ufile'])){
$c=count($_FILES['ufile']);
}else{
$c=0;
}


if(isset($_GET['del']) && !empty($_GET['del'])){

$file=(string)$_GET['del'];
    
    if (@file_exists($rep.'/'.$file)){
        
        @unlink($rep.'/'.$file);
        $file=NULL;
        unset($_GET);
        
    }else{
    }

}else{
}


if(isset($_POST['Sub']) && $_SERVER['REQUEST_METHOD']==="POST" ){

echo '<div align="center"><pre>';

    
    echo '<a href="'.$_SERVER['PHP_SELF'].'">RETOUR AU FORMULAIRE</a><br />';
    
    
    foreach($_FILES as $k => $v) {
           
           $ti = 0 ;
           
           while($ti<$j) {
           
           $erreur="";
           
           echo '<hr><font color="red"><h3>'.$ti.'</h3></font><br />';
           
           if(empty($v['name'][$ti])){
           $erreur .= ' VIDE <br />';
           }else{
           
           }
                              
           
           if(strlen($v['name'][$ti]) > 64 ){
           $erreur .= ' Le nom est trop long <br />';
           }else{
           }
           
           
          /*nettoyage nom*/
                  
          
          $v['name'][$ti] = strtr($v['name'][$ti],
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
          
          $v['name'][$ti]=strtolower($v['name'][$ti]); /* .JPG -> .jpg ...*/
                         
          
          $v['name'][$ti] = preg_replace('/([^.a-z0-9]+)/i', '-', $v['name'][$ti]);
          
          /*CES LIGNES SI ON VEUT UN FICHIER UNIQUE A CHAQUE UPLOAD*/
          /*JOUR - MOIS - ANNEE - HEURE - MINUTE - id - NOM*/
          
          $dateur = date('m-d-Y-H-i-').uniqid();  /*cette ligne*/
          if(isset($dateur)){
          $v['name'][$ti] = $dateur.$v['name'][$ti]; 
          }else{
          }
          /*SINON DEVALIDER CES LIGNES*/
                                         
          /*fin nettoyage nom*/ 
           
          
           //echo 'name : '.$v['name'][$ti].'<br />';
           //echo 'type : '.$v['type'][$ti].'<br />';
           //echo 'tmp : '.$v['tmp_name'][$ti].'<br />';
           //echo 'error : '.$v['error'][$ti].'<br />';
           //echo 'size : '.$v['size'][$ti].'<br />';
           
                     
           
           //On fait un tableau contenant les extensions autorisées.
           //Comme il s'agit d'un avatar pour l'exemple, on ne prend que des extensions d'images.
           //$extensions = array('.png', '.gif', '.jpg', '.jpeg'); /*ici des images*/
           // récupère la partie de la chaine à partir du dernier . pour connaître l'extension.
           $extension = strrchr($v['name'][$ti], '.');
           //Ensuite on teste
           if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
           {
           $erreur .= ' Vous devez uploader un fichier de type gif, jpg, jpeg<br />';//exit;
           }
           
           /*et si il fake ou spoof*/
           $blacklist = array(".php", ".phtml", ".php3", ".php4",".exe",".bin",".zip",".js",".bat");  /*etc ...*/
           foreach ($blacklist as $item) {
           if(preg_match("/$item\$/i", $v['name'][$ti])) {
           $erreur .= " EXTENSION DE FICHIER INTERDITE <br />";
           //exit;
           }
           }
           
           /*verifier le type mine autant de if, else if que de type*/
           if($v['type'][$ti]==="image/pjpeg"){
           //ok 
           }
           
           else if($v['type'][$ti]==="image/gif"){
           //ok
           }
           
           else{
           $erreur .= $v['name'][$ti].' Verifier le format<br />'; 
           $autorisation=false;
           }                                                                                                                                                                                                  
                                                  
           //Taille du fichier secu 2 par la function filesize
           $taille = filesize($v['tmp_name'][$ti]);
           if($taille>$size_max){
           $erreur .= $v['name'][$ti].' FICHIER VRAIMENT TROP GROS<br />';
           }else{
           }
           
           if($v['error'][$ti]===0){
           echo $v['name'][$ti].' uploadable <br />'; 
           }else{
           $erreur .= $v['name'][$ti].' Non uploadable<br />';
           $autorisation=false;
           //echo $erreur.'\n';
           }
           
               if($v['size'][$ti]>$size_max){
               
               $erreur .= $v['name'][$ti].' FICHIER TROP GROS<br />';
               $autorisation=false;
               
               } elseif($erreur===""){
               
               
               /*pas d erreur on traite*/    

                               
               $autorisation=true;
               
               /*upload*/
               
               $f=$v['tmp_name'][$ti];
               $path="upload/".$v['name'][$ti];
                                   
                   if(isset($f) && !empty($f) && $autorisation==true){
                   
                   copy($f,$path);
                   
                   @unlink($f); /*on efface le tmp*/
                   
                   echo '<h3><font color="green">Copie reussie</h3></font>'.$v['name'][$ti].'<br />';
                   
                   
                          if(file_exists($path)!=""){
                          
                          echo "<p>";
                          echo "file name :".$v['name'][$ti]."<br/>";
                          echo "file size :".$v['size'][$ti]."<br/>";
                          echo "file type :".$v['type'][$ti]."<br/>";
                          echo "<img src=\"".$path."\" width=\"150\" height=\"150\">";
                          echo "</p>";
                          
                          }else{
                          echo 'image1 ?<br />';
                          }
                                       
                   }else{
                   
                   $autorisation=false;
                   $path="";
                   $f="";
                   }
               
               }else{            
               
                                       
           
              
              
              }
              
           echo '<font color="red">'.$erreur.'</font>';   
           /*image suivante*/            
           
           $ti++;
           $autorisation=false; /*prochain $_FILES non autorisé*/ 
           
           }/*fin du while*/
  
     
  
  } /*fin du foreach*/

echo '</pre></div>';

exit;

}else{
$form = '<table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFEEDD">
<tr>
<td><strong>Uploadeur Multiple</strong></td>
</tr>
';
$i=0;
while($i<$j){
$form .='<tr>';
$form .= '<td>CHOISIR UN FICHIER '.($i+1).'  
<input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
</tr>';
$i++;
}

$form .= '<td align="center"><input type="submit" name="Sub" value="Upload" /></td>
</tr>
</table>
</td>
</form>
</tr>
</table>';
echo $form;
}



/*listage du repertoire */

echo '<div align="center">';

if ($handle = opendir($rep)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            
            //$extensions = array('.png', '.gif', '.jpg', '.jpeg'); /*ici des images*/
            // récupère la partie de la chaine à partir du dernier . pour connaître l'extension.
            $extension = strrchr($file, '.');
           //Ensuite on teste
            if(in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
            {
           
            echo $file.' : <a href="?del='.$file.'">Effacer</a> <a href="'.$rep.'/'.$file.'">Voir</a><br />';
            
            
            }else{
            
            /* les fichiers interdits */ 
            
            }
            
        }
    }
    closedir($handle);
}
 
echo '</div>';
?>

Conclusion :

- bricoler en une aprés-midi
- j'aimerai partager des idées de sécurisation
- si on ajoute un systeme d'identification simple on a un petit gestionnaire
- on pourra facilement interfacer sur mysql si on ajoute des champs au formulaire ...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Tu t'embetes pour recuperer l'extention de ton fichier :

$ext = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION); et hop ! :)
Ton script est une bonne base mais on peu l'améliorer :

Tu devrai vérifier les caractères du nom du fichier : if(preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $file)) si il contient un de ces caractères c'est plutôt mauvais signe ^^

Chaque fichier a un nom unique mais je pense que md5(uniqid('H', 5)); suffit pour avoir un nom assez unique.

Tu vérifie bien le type mime mais tu ne vérifie pas que l'extension concorde, c'est toujours une sécurité de plus.

Pour être encore plus sécurisé l'idéal serai de regarder le contenu du fichier mais ca deviens plus complexe du coup.

Voila ce qui me viens a l'esprit après je suis loin d'être bon en secu ^^
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
@morphinof

Merci pour tes remarques elles sont à prendre en compte !
Oui en effet on peut ameliorer le script qui n'est qu'une base de travail

$ext = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
interressant je peux alors comparer à $extension

comparer le mine avec l'extension
mine -> image/pjpeg et jpg ou jpeg?
ça me semble plus hasardeux peut etre penses tu as truc du genre
exemple :
$mine="image/pjpeg";
$mine=substr($mine,-4);
if($mine===$extension) ...

le nom unique là les méthodes ne manque pas chacun decide
md5(uniqid('H', 5)); oui je pense aussi que c'est mieux

\x00-\x1F\x7F-\x9F remarque judicieuse
http://phpcodeur.net/articles/php/upload
j'ai lu l'article aussi (-:

if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )
{
exit("Nom de fichier non valide");
}
else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}

a++ bne prog
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Pour l'extension je pensais en fait a un bête tableau associant l'extension du fichier avec son extension mime histoire de dire je reçois un .jpeg alors son extension mime est => image/pjpeg.

Oui c'est un article très intéressant j'ai beaucoup aime ^^

Ça serai bien que quelqu'un qui s'y donnai donne son avis, je suis curieux dans ce domaine :)
aspkiddy
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014
-
Bonjour cod57,

Excellent code pour une application local...

je l'ai testé sur mon ordi, localement, sous Windows (localhost)

Ça marche...

par contre, j'ai changé la ligne 123 où il y a le mime (type) de jpeg pour que ça marche avec JPG

Il fallait écrire "image/jpeg" au lieu de "image/pjpeg"

voici le bon : if($v['type'][$ti]==="image/jpeg"){

par contre, ton code ne marche pas lorsque le met sur un serveur externe (comme goDady) sous Windows (iis)

Voici le message d'erreur :

Warning: copy(upload/04-08-2011-10-07-4d9f32b284398coul.gif) [function.copy]: failed to open stream: Permission denied in D:\Hosting\4568795\html\testr\ftp\index3.php on line 171

et le code de cette ligne est le suivant :

copy($f,$path);

alors, je l'ai mis sur un autre serveur externe sous Windows (iis)

quand je clique sur le bouton "Upload" Ça ne marche pas non plus :
Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.

Alors à mon avis, il faut ajouter aussi d'autres codes au niveau de droit d'écriture... Mais je ne sais pas ce qu'il faut écrire...

Bon courage
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
bonsoir

j'ai retesté mon script sur ovh php 5 , free en php 5, en local wamp2(apache), easyphp, il tourne !

@Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.

oui sans doute le repertoire ... 'chmod' et une commande unix pas 'windows' faudrait
changé les droits sous le serveur iis
soit le fichier est copié mais injoignable soit il l'est pas present du tout.
tu devrais ecrire ce fichier à la main (creer un repertoire upload).

@mkdir($rep, 0705); marche pas sous windows

copy ? bon peut toujours essayer
is_uploaded_file
move_uploaded_file
mais je crois pas que ce soit ça

le type mine
c'est image/pjpeg sous ie
et image/jpeg pour chrome firefox (va savoir pourquoi)
donc il suffit de remplacer
if($v['type'][$ti]==="image/pjpeg"){
par
if($v['type'][$ti]==="image/pjpeg" or $v['type'][$ti]==="image/jpeg"){

a++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.