Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE PHP5 D'UPLOAD / REDIMENSIONNEMENT D'IMAGE GD


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : upload, redimensionnement, image, gd, php5 Niveau : Initié Date de création : 29/09/2005 Vu / téléchargé: 14 458 / 993

Note :
8,63 / 10 - par 8 personnes
8,63 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note

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

  • <?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
  • ?>
<?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 !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de bbcluny le 30/09/2005 15:40:44

Salut,

peut on avoir un exemple d'utilisation de ta classe ?

Merci d'avance

signaler à un administrateur
Commentaire de littlewings le 30/09/2005 16:34:30

Bien sûr, j'aurais du en mettre un, autant pour moi !
Alors supposons que nous ayont un formulaire html avec un champ de type "file" avec un attribut name="monFichier". Dans la page PHP traitant les données de ce formulaire (en POST), on fera :

// instantiation d'un nouvel objet de type Upload

$myUpload = new Upload();

// upload du fichier sur le serveur
// pour cela, il faut renseigner le chemin de destination sur le serveur
// ici : le répertoire "img" à la racine

$uploadPath = "../img/";

// enfin, on balance l'upload
// 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) => ici : "avatar";
// 4ème : côté maxi de l'image si c'est une image (90px par défaut, peut se modifier à la ligne ) ;
// 5ème : type attendu (défault : n'importe quel type) => ici, "thumb" est un paramètre lançant automatiquement le redimensionnement de l'image . Pour ajouter des types, il faut modifier la méthode uploadFile() de la classe (ou l'étendre).

$myUpload ->doUpload("monFichier",$uploadPath,"avatar","90","thumb");

// et si je veux récupérer le nom du fichier (pour l'insérer dans une BDD par exemple), je fais tout de suite après appel à la méthode getName () :

$nomduFichier = $myUpload->getName() ;

// Et voilà ! ^^ Une petite note SVP !

signaler à un administrateur
Commentaire de Tranus le 01/10/2005 10:34:10

Yop Noor!

Intéressant cette classe maintenant que tu as mis un exemple d'utilisation... Je vais la tester.

Au fait, tu as trouvé la solution pour notre fonction Javascript?

A+

L'ami Kévin

signaler à un administrateur
Commentaire de littlewings le 01/10/2005 11:00:26

Comme on se retrouve ! C'est marrant, la première personne à se servir de mon source est un ami à moi (et un collègue) ! ;-)
Pour la fonction javascript, j'avoue que je n'ai pas pris plus de temps pour me pencher dessus... Tu connais mon emploi du temps...
On continuera cette discution par mail, car ce site n'est pas un forum, et j'ai pas trop envie qu'on se fasse engueuler ! ^^

signaler à un administrateur
Commentaire de damne le 21/11/2005 08:32:46

Bon code !
Classe intéressante.

signaler à un administrateur
Commentaire de boguet le 24/11/2005 20:17:36

Je n'ai pas trop compris ce nom classe...

Je peux ajouter ce code a mon script d'upload sans trop adapter?

Sorry mais je suis en noob lol.

signaler à un administrateur
Commentaire de kabkinfr le 16/12/2005 22:24:11

J'ai un pb quand j'ésssaie d'utiliser ce code, il m'affiche:
unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

Pourriez vous m'indiquer d'où vient cette erreur?

Merci

signaler à un administrateur
Commentaire de kabkinfr le 16/12/2005 22:36:49

C'est bon, maintenant, il n'y a plus rien d'écrit, mais il n'y a aucun upload non plus...

signaler à un administrateur
Commentaire de damne le 16/12/2005 22:43:53

Penses à donner les droits en écriture sur le dossier qui réceptionne les upload.

signaler à un administrateur
Commentaire de kabkinfr le 17/12/2005 00:07:01

c'est bon, ca marche nickel !!

merci

signaler à un administrateur
Commentaire de littlewings le 17/12/2005 08:29:42

Merci pour vos commentaires !

Mais où est cette erreur :

unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

?

Ca sserait sympa de me le signaler que je le corrige.

signaler à un administrateur
Commentaire de guybrush le 16/01/2006 11:48:16

L'erreur

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

peut apparaitre si vous n'utilisez pas le PHP5.

signaler à un administrateur
Commentaire de littlewings le 17/01/2006 16:28:49

J'ajoute pour les néophytes : ne pas oublier de mettre enctype="multipart/form-data" et method="POST" dans la balise <form> !

signaler à un administrateur
Commentaire de rommosc le 10/02/2006 04:43:35

je tombe aussi sur une erreur à l'execution du script :

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in classupload.php on line 10

et la ligne 10 c'est celle ci :

private $uploadedFileName ;

signaler à un administrateur
Commentaire de littlewings le 10/02/2006 14:32:45

C'est tout simplement parce que tu n'utilises pas PHP5 !

signaler à un administrateur
Commentaire de rommosc le 10/02/2006 19:50:18

et bien il me semble que si pourtant !!
archh...

signaler à un administrateur
Commentaire de pouda le 01/10/2006 18:36:36

tres cool cette classe...je met 10

signaler à un administrateur
Commentaire de krovomite le 18/10/2006 09:43:39

Salut,

J'aimerai savoir si le boutde code : "if (is_uploaded_file($this->uploadedFile))", est executé que si l'on a les droits en 775 sur le dossier dans lequel on veut uploader les fichiers, ou si cela peut venir d'autre chose ?

Merci :)

signaler à un administrateur
Commentaire de webdeb le 20/01/2007 14:00:10

Classe assez mal codée :s Je mets 5/10

signaler à un administrateur
Commentaire de littlewings le 20/01/2007 17:43:21

@Webdeb => c'est vrai. Aujourd'hui je ne mettrais guère plus...
Mais je continue de progresser, je posterais des trucs mieux fait dès que j'en aurais l'occasion !
Je suis actuellement en train de travailler sur une vraie classe de gestion de fichiers, qui j'espère sera meilleure.

signaler à un administrateur
Commentaire de ilya79 le 14/02/2007 16:32:17

tres sympa et simple d'utiliqation ta classe, la classe quoi :D (youppi pour le jeux de mots!)

signaler à un administrateur
Commentaire de ilya79 le 15/02/2007 15:18:23

Petite correction de bug, la classe detecte le type mime du fichier envoyé et execute des methodes en fonction du type. Or ce c... de IE renvoi pour les jpeg progressifs    "image/pjpeg" et pas "image/jpeg" . Je t'invite a l'ajouter dans la liste des type mime reconnus ;)

signaler à un administrateur
Commentaire de rajas le 07/05/2008 18:41:12

J'ai eu aussi le message d'erreur cité plus haut : unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in classupload.php on line 10
En local ça fonctionne mais sur le serveur php5 de free le message apparait.
J'ai réglé le problème en supprimant tous les private et public devant function, et en remplaçant private par var devant les variables.
Maintenant ça fonctionne plutôt bien :-)
Par contre lorsque l'upload ne fonctionne pas, je n'ai pas le message d'erreur, il ne s'affiche pas. dommage.
J'ai essayé sans succès de régler le problème, je suis trop débutant.
En tout  cas merci pour cette source
bonne programmation

signaler à un administrateur
Commentaire de canibale le 14/05/2008 19:20:51 10/10

Bonne source, très utile, hop un dix bien mérité !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

générer des miniatures avec gd 1.6 [ par vegetaline ] muhaha alors là c'est rigolo, un super défi pour les programmeurs fous!ok j'ai le code pour générer des miniatures grâce au php, mais ça marche qu'ave upload dans table [ par eax ] salut!je voudrais savoir s'il est possible d'uploader un fichier (une image par exemple) et le stocker dans un champ d'une base de données mysqlje vou Upload d'Image et resize de cette image [ par 4feeling ] je cherche un petit bout de script qui permettrai d'uploader une image jpeg et l'enregistrer dans une taille précise. Par exemple on uploade, et on en Upload image et limitation taille [ par millo ] Je suis entrain de dévellopé un script ou je propose l'upload de photo mais pour des raisons évidentes je souhaite limiter l'espace disque réservé pou upload d'image [ par guikiki ] Bonjour à tous!!!voilà..encore un problème que je n'ai toujours pas réussit à résoudre et ce n'est pas faute d'essayer!!voilà, j'ai fait une page en i upload d'images [ par G_ki_aime_pas_le_php ] Salut à tous!G un petit problème j'essaie d'uploader un fichier et ça fonctionne pas.G TOUT essayé j'en ai marre!Est ce que quelqu'un aurait la soluti afficher les image d'un repertoir et un sous repertoir + upload [ par angelx ] bonjour je voudrais afficher les image d'un reperoire et SOUS Repertoire + faire un uploade sans donner le chemin de l'image en utilisant les image ge Upload image .. j'ai cherché mais je ne comprends pas .. :S [ par Hash2o ] Voila, je suis a la recherche d'une solution pour uploader une image sur un serv. J'ai essayé la plus part des solutions proposer sur le site mais je lycos et library GD [ par bobbycoul ] bonjour,j'ai un compte gratuit sur lycos (multimania), et la library GD (la version 2 est installé sur leur serveurs) foire jexplique:qd je créé une i Upload :) [ par GuilleW ] Bonjour bonjour,Je souhaite faire un Upload de fichier.pour cela j'ai un image , et je souhaiterai que lorsque l'on click sur cette image, elle lance


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,33 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.