Vérification du mime-type, de l'extension et de la taille

Résolu
Bonjour,
Je sollicite votre aide pour vérifier l'extension et la taille d'une image lorsqu'un utilisateur ajoute cette dernière, histoire d'éviter de mauvaises surprises dans l'avenir:
Voici ma fonction savephoto:
function savePhoto($id_annonce,$file,$location){

    if(empty($file)){
      echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
      var_dump($_FILES); 
      return false; 
    }

    $error='';
//mime-type
$mime_types = array('png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif');


//taille
$taille_maxi= 3Mo;

    $photo = $file['name'];
    $photo_tmp = $file['tmp_name'];

if(isset($mime_types)){
  
  if ($photo>$taille_maxi)
  {$error = 'Le fichier est trop gros...';}

    if(move_uploaded_file($photo_tmp,$location.$photo)){
       return insertPhoto($id_annonce,$location.$photo); 
  } else{
    $error = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...';
  }
}


Configuration: Windows / Chrome 97.0.4692.71

6 réponses

  1. Contributeur
    bonjour,
    $photo_taille = $file['size'];
    1
    1. Modérateur
      Bonjour,

      
      function savePhoto($id_annonce,$file,$location){
      
        if(empty($file)){
          echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
          return false; //pas d'image
        }
      
        //taille
        $taille_maxi= 100000; // A noter qu'il y a aussi un paramétrage dans le php.ini pour limiter la taille max des fichiers qu'on peut uploader!
      
        $photo_taille = $file['size'];
        $photo = $file['name'];
        $photo_tmp = $file['tmp_name'];
      
        
        if (is_uploaded_file($photo_tmp)) {
          // Notice how to grab MIME type.
          $mime_type = mime_content_type($photo_tmp);
          
          
          //mime-type
          $allowedMimes = array(
           'image/png',
           'image/jpeg',
           'image/jpeg',
           'image/jpeg',
           'image/gif'
          );
      
          if(!in_array($mime_type,$allowedMimes){
            echo "Type de fichier " . $mime_type . " invalide !";
            return false;
          }
          
            //pour les tests:
          echo "<br>photo_taille : " . $photo_taille;
          echo "<br>taille_maxi : " . $taille_maxi;
          
          
          if ($photo_taille > $taille_maxi){
            echo 'Le fichier est trop gros...';
            return false;
          }
      
          if(move_uploaded_file($photo_tmp,$location.$photo)){
             return insertPhoto($id_annonce,$location.$photo); 
          }
          
          
        }else{
          echo "<br>Erreur lors de l'upload du fichier !";
          return false; 
        }
      }
      


      1
      1. Modérateur
        J'ai édité le code pour corriger un souci au niveau du mime_types.
        1
    2. Bonjour yg_be, merci pour ta réponse :)
      Je n'ai pas d'erreur. J'ai dû changer l'unité Mo de la variable $taille_maxi, et laissé celle sans unité.
      Question: C'est combien 100000? Est-ce 10 Mo ou 1 Mo?
      function savePhoto($id_annonce,$file,$location){
      
          if(empty($file)){
            echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
            var_dump($_FILES); 
            return false; //pas d'image
          }
      
          $error='';
      //mime-type
      $mime_types = array('png' => 'image/png',
      'jpe' => 'image/jpeg',
      'jpeg' => 'image/jpeg',
      'jpg' => 'image/jpeg',
      'gif' => 'image/gif');
      
      
      //taille
      $taille_maxi= 100000;
      
      $photo_taille = $file['size'];
          $photo = $file['name'];
          $photo_tmp = $file['tmp_name'];
      
      if(isset($mime_types)){
        
        if ($photo_taille>$taille_maxi)
        {$error = 'Le fichier est trop gros...';}
      
          if(move_uploaded_file($photo_tmp,$location.$photo)){
             return insertPhoto($id_annonce,$location.$photo); 
        } else{
          $error = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...';
        }
      }
      0
      1. Contributeur
        l'unité de taille est l'octet.
        pour un fichier, une taille de 100000 octets, cela fait environ 98 Ko.
        1
    3. Mais pourquoi lorsque j'ai ajouté une image à 1 294 160 octets ça n'affiche pas que le fichier est trop gros?
      0
      1. Contributeur
        ajoute peut-être un echo().
        0
    4. J'ai ajouté un echo et ça n'a pas affiché l'erreur:
      function savePhoto($id_annonce,$file,$location){
      
          if(empty($file)){
            echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
            var_dump($_FILES); // juste pour le debug...
            return false; //pas d'image
          }
      
      //mime-type
      $mime_types = array('png' => 'image/png',
      'jpe' => 'image/jpeg',
      'jpeg' => 'image/jpeg',
      'jpg' => 'image/jpeg',
      'gif' => 'image/gif');
      
      
      //taille
      $taille_maxi= 100000;
      
      $photo_taille = $file['size'];
          $photo = $file['name'];
          $photo_tmp = $file['tmp_name'];
      
      if(isset($mime_types)){
        
        if ($photo_taille>$taille_maxi)
        {echo 'Le fichier est trop gros...';}
      
          if(move_uploaded_file($photo_tmp,$location.$photo)){
             return insertPhoto($id_annonce,$location.$photo); 
          }
        } else{
          echo 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...';
        }
      }
      
      0
      1. Contributeur
        peut-être ajouter des éléments utiles, comme $photo_taille, dans l'echo. et, pourquoi pas, dans la foulée, faire un var-dump de $file?
        1
    5. Bonjour Jordane, ça marche parfaitement. Si la taille de l'image est supérieure à, l'annonce n'affiche pas d'image. Merci !
      0