Classe php5 d'upload / redimensionnement d'image gd

Soyez le premier à donner votre avis sur cette source.

Vue 26 479 fois - Téléchargée 1 513 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

Messages postés
24
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
6 décembre 2010

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?
Messages postés
2
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
29 octobre 2010

bonjour,
peut on modifier le code pour convertir les images png, gif en jpg avant l'upload. merci.
Messages postés
1
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
24 septembre 2010

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');
Messages postés
1
Date d'inscription
mardi 19 juin 2007
Statut
Membre
Dernière intervention
29 avril 2010

Cool, allez 9 !
Messages postés
4
Date d'inscription
mardi 24 août 2004
Statut
Membre
Dernière intervention
17 avril 2010

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.