Classe php5 d'upload / redimensionnement d'image gd

Soyez le premier à donner votre avis sur cette source.

Vue 27 099 fois - Téléchargée 1 530 fois

Description

Je me suis fais cette classe vite fait, et je l'ai trouvé bien pratique alors je la fais tourner.
Elle permet d'uploader très facilement des fichiers, et si c'est des images, de les redimensionner à la volée en conservant les proportions.

Source / Exemple :


<?php
//
// Upload Class (janvier 2005)
// Nordine Ghachi
// from TanukiDesign
// http://www.tanukidesign.com
//
class Upload {

  private $uploadedFileName ;
  private $uploadedFile ;
  private $uploadedFileSize ;
  private $uploadedFileType ;

  public function __construct(){ // constructeur
    // je préfère définir mes paramètres d'upload dans la méthode doUpload()
    // comme ça je peux construire mon objet Upload() avant même de recevoir un fichier d'un formulaire
    // et balancer l'upload quand je veux avec cette méthode
  }
  
  // Méthode doUpload() 
  // 1er paramètre : nom du champs file du formulaire ;
  // 2ème : chemin de destination sur le serveur ;
  // 3ème : nouveau nom de fichier SANS EXTENSION car on prend celle du fichier d'origine (facultatif) ;
  // 4ème : côté maxi de l'image (90px par défaut) ;
  // 5ème : type attendu (défault : n'importe quel type) ;
  public function doUpload($file_form_name,$uploadPath=".",$newname="",$sizemax=90,$constraint=""){
    // si l'on a pas donné un nouveau nom au fichier, il garde le nom d'origine
    if ($newname=="") {
      $this->uploadedFileName = $_FILES[$file_form_name]["name"] ;
    } else {
      $extent = pathinfo($_FILES[$file_form_name]["name"]) ;
      $extent = $extent["extension"] ;
      $this->uploadedFileName = $newname.".$extent" ;
    }
    
    // récupération du nom temporaire sur le serveur, de la taille du fichier et de son type
    $this->uploadedFile = $_FILES[$file_form_name]["tmp_name"];
    $this->uploadedFileSize = $_FILES[$file_form_name]["size"];
    $this->uploadedFileType = $_FILES[$file_form_name]["type"];
    //on commence par verifier que le dossier d'upload existe
    if (file_exists($uploadPath)) {
      //on verifie que le fichier soit bien uploader pour des questions de securite
      if (is_uploaded_file($this->uploadedFile)) {
        if (!file_exists($uploadPath.$this->uploadedFileName)) { // on vérifie que le fichier n'existe pas déja (sinon, on lui concatène un 1)
          //on appelle la fonction d'upload
          $this->uploadFile($this->uploadedFile, $this->uploadedFileName, $uploadPath, $newname, $sizemax, $this->uploadedFileType, $constraint);
          //pour activer la modification des permissions enlever les deux // devant la ligne suivante
          //chmod ("$uploadPath$uploadedFileName", $permission);
        }else{
          $this->uploadedFileName="1".$this->uploadedFileName;
          $this->uploadFile($this->uploadedFile, $this->uploadedFileName, $uploadPath, $newname, $sizemax, $this->uploadedFileType, $constraint);
      }
    }
    }else{
      print "Erreur: le dossier $uploadPath n'existe pas";
    }
  }
  
  //fonction pour l'upload des fichier, on utilise la fonction copy et on modifie les noms
  private function uploadFile($file, $name, $directory, $newname, $sizemax, $type,$constraint) {
    copy($file, $directory.$name) or die ("Impossible d'uploader le fichier");
    
    $fullpath = $directory.$this->uploadedFileName ; // chemin complet de l'image sur le serveur

    // Si c'est un fichier image, on vérifie que c'est bien un fichier image (type MIME)

    if ($constraint=="image") {
      if ($type!="image/jpeg" && $type!="image/png" && $type!="image/gif") {
        @unlink($fullpath);
        echo '<script>alert("Ce n\'est pas un fichier image !");</script>' ;
      }
    }

    // redimensionnement si c'est un thumb (avatar par exemple)
    
    if ($constraint=="thumb") {
      switch($type){
      case "image/jpeg":
      $function_image_create = "ImageCreateFromJpeg";
      $function_image_new = "ImageJpeg";
      break;
      case "image/png":
      $function_image_create = "ImageCreateFromPng";
      $function_image_new = "ImagePNG";
      break;
      case "image/gif":
      $function_image_create = "ImageCreateFromGif";
      $function_image_new = "ImageGif";
      break;
      default:
      @unlink($fullpath);
      if ($newname=="avatar") {
        echo '<script>alert("Votre avatar n\'est pas un fichier image, vous aurez donc l\'avatar par défaut !\n Vous pouvez toutefois le modifier dans votre profil.");</script>' ;
      } else {
        echo '<script>alert("Ce n\'est pas un fichier image !");</script>' ;
      }
      exit;
      break;
      }
      
      list($width, $height) = getimagesize($fullpath); // on récupère les dimensions de l'image
      
      // si l'un des côté est supérieur à $sizemax, on redimensionne en conservant les proportions
      if ($width>$sizemax || $height>$sizemax) {
              
              $ratio = $height/$width;
              $newheight = ($height > $width) ? $sizemax : $sizemax*$ratio;
              $newwidth = $newheight/$ratio;
                                              
              $thumb = ImageCreateTrueColor($newwidth,$newheight);
              $source = @$function_image_create($fullpath);
              
              ImageCopyResampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
              
              @$function_image_new($thumb,$fullpath);
      }
    }
  }
  
  public function getName() {
          return $this->uploadedFileName;
  }

}// fin de la classe

?>

Conclusion :


Je sais, ce n'est pas très bien commenté, mais normalement ça l'est suffisament !
J'ai également une version prenant en charge la librairie imagick, si ça intéresse quelqu'un, écrivez-moi !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
tclo2 Messages postés 24 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 6 décembre 2010
10 nov. 2010 à 12:48
Cette classe ne fonctionne pas avec le browser internet explorer: constanment j'ai alerle "Ce n'est pas un fichier image".
Par contre sous d'autres browsers, ca marche sans probleme. Pourriez-vous me dire comment remedier a cette situation?
cs_kate59 Messages postés 2 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 29 octobre 2010
29 oct. 2010 à 12:38
bonjour,
peut on modifier le code pour convertir les images png, gif en jpg avant l'upload. merci.
youssefchrifyoussefchrif Messages postés 1 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 24 septembre 2010
24 sept. 2010 à 16:48
enfin il fonctionne merci pour ce script, n’oublie pas de determiner une liste des extensions valide exemple
$_valide_ext = array('gif', 'jpg', 'jpeg', 'png', 'swf', 'swc', 'psd', 'tiff', 'bmp',
'iff', 'jp2', 'jpx', 'jb2', 'jpc', 'xbm', 'wbmp', 'doc', 'txt', 'rtf', 'pdf', 'xls', 'rar', 'tar', 'zip', 'tgz', 'gz');
wakker Messages postés 1 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 29 avril 2010
29 avril 2010 à 17:18
Cool, allez 9 !
master dje Messages postés 4 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 17 avril 2010
17 avril 2010 à 10:26
oups désolé autant pour moi l'erreur vient de moi xD
Afficher les 32 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.