Uploadeur de fichiers multiples v1

Soyez le premier à donner votre avis sur cette source.

Vue 9 816 fois - Téléchargée 1 800 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

Messages postés
273
Date d'inscription
dimanche 4 octobre 2009
Statut
Membre
Dernière intervention
25 août 2014
4
merci beaucoup pour votre réponse Cod75
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
12
BONJOUR

la réponse est là
http://phpcodeur.net/articles/php/upload
il faut eviter de faire injecter un shell par une image detournée

on peut pousser la protection du repertoire upload par un .htaccess sur un serveur apache

.htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi
#Disabling executing of these files
#could give us an extra layer of protection.
#Further if you are allowing your users only photos
#or picturer, you can restrict other files by placing
#the following code your your .htaccess file.
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>

a++
Messages postés
273
Date d'inscription
dimanche 4 octobre 2009
Statut
Membre
Dernière intervention
25 août 2014
4
J'ai une question bête car je suis bête:

Pourquoi le fait qu'un noùm de fichiers contienne des caractères '#[\x00-\x1F\x7F-\x9F/\\\\]#' est un mauvais signe ?
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Super COD57,

J'ai fait comme tu dis : j'ai créée le répertoire "upload" et j'ai redefini les droits sur ce répertoire... Alors Ça marche sans erreur...

Merci pour les explication sur pypeg et jpeg...

Bonne journée
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
12
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++
Afficher les 9 commentaires

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.