begin process at 2012 02 15 22:16:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE PHP5 D'UPLOAD / REDIMENSIONNEMENT D'IMAGE GD

CLASSE PHP5 D'UPLOAD / REDIMENSIONNEMENT D'IMAGE GD


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :23 294 / 1 355

Auteur : littlewings

Ecrire un message privé
Commentaire sur cette source (32)
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip CLASSE PHP5 DE PANIER TOUTE SIMPLE

 Sources de la même categorie

Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GESTIONNAIRE DE NEWS BASIQUE AVEC UPLOAD D'IMAGES par cod57
Source avec Zip Source avec une capture UPLOADEUR DE FICHIERS MULTIPLES V1 par cod57
CRÉER UNE IMAGE À PARTIR DU TEXTE par dilar
UPLOAD IMAGE AVEC MINIATURE par dilar
Source avec Zip MINIATURISATION D'IMAGE V2 par Palleas_44

Commentaires et avis

Commentaire de bbcluny le 30/09/2005 15:40:44

Salut,

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

Merci d'avance

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 !

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

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 ! ^^

Commentaire de damne le 21/11/2005 08:32:46

Bon code !
Classe intéressante.

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.

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

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...

Commentaire de damne le 16/12/2005 22:43:53

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

Commentaire de kabkinfr le 17/12/2005 00:07:01

c'est bon, ca marche nickel !!

merci

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.

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.

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

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 ;

Commentaire de littlewings le 10/02/2006 14:32:45

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

Commentaire de rommosc le 10/02/2006 19:50:18

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

Commentaire de pouda le 01/10/2006 18:36:36

tres cool cette classe...je met 10

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 :)

Commentaire de webdeb le 20/01/2007 14:00:10

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

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.

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!)

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 ;)

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

Commentaire de canibale le 14/05/2008 19:20:51 10/10

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

Commentaire de lanner le 27/03/2010 16:37:41 10/10

Salut

Quelqu'un pourrait faire une archive avec un formulaire directement fonctionnel (très simple sans design ni rien) ?
J'ai un peu de mal à mettre en pratique
Car je cherche a faire un upload d'image + champs textes à placer dans une bdd
Merci par avance pour le travail :)

Commentaire de lanner le 27/03/2010 16:58:53

Donc plus je test et plus c'est fort intéressant bravo

Par contre partant d'un png la couleur de fond reste noir meme avec $image->setColor(255,255,255); normal ?

Commentaire de master dje le 17/04/2010 10:24:01

Bonjour,

j'ai un parse error ligne 121... Pourtant la syntaxe est bonne... Quelqu'un a le même soucis ?

Commentaire de master dje le 17/04/2010 10:26:41

oups désolé autant pour moi l'erreur vient de moi xD

Commentaire de wakker le 29/04/2010 17:18:23 9/10

Cool, allez 9 !

Commentaire de youssefchrifyoussefchrif le 24/09/2010 16:48:17

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');

Commentaire de kate59 le 29/10/2010 12:38:12

bonjour,
peut on modifier le code pour convertir les images png, gif en jpg avant l'upload. merci.

Commentaire de tclo2 le 10/11/2010 12:48:53

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?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Upload de fichier php [ par paulito47 ] Je réalise un script php qui génère un formulaire qui permet la collecte des informations nécessaires pour l'ajout d'une photo (titre, description) et Probleme avec un formulaire d'upload [ par prog2ni ] Bonjour, Je suis debutant en php. Je vous explique mon probleme : J'ai en place un script d'upload d'image, il fonctionne, associer a ce script, j'in Problème librairie GD ! [ par kikifrance ] Salut! Problème. J'ai créé une image avec la librairie GD, j'obtiens l'image en .php. Je teste avec Chrome, Firefox, IE, et Safari (ainsi que sur l Formulaire avec image___ upload sur le site et raccourci dans la base [ par bidbidon ] Bonjour, je suis novice en php!!! J'arrive à transferer toutes [u]les données écrites[/u] de mon formulaire sur ma base!!! Mais j'ai ajouter un <inp redimensionner une photo lrs de l'upload [ par boubeuch1 ] Bonjour, Je souhaiterais faire en sorte que quelque soit la taille de l'image d'origine, lorsqu'elle est téléchargé sur le serveur, celle-ci est redi mon script crée mes fichiers dans un endroit inattendu [ par angelimad ] bonjour tout le monde. mon problème c'est que j'ai un site php hébergé sur un serveur Linux. mon script upload le fichier via le formulaire du client Problème avec GD & Image_Text [ par BencoAndCo ] Bonjour, J'utilise EasyPhp 3.0 pr tester mon site web en local mais depuis un certain tps j'essaye de faire un Captcha j'ai telechargé la lib pear c upload un fichier .txt [ par meusanland ] bonsoir à tous depuis quelques année je développe différent site web via AS2 et AS3 cependant un client vient de me commander un site en HTML et en C ffmpeg image bisard [ par manu7930 ] un script avec ffmpeg qui donne ça quand on lui demande de faire une image : pourquoi ? [color=red]//génération de l image $gd_image = $frame->toG Détruire une image après sont upload [ par spike911 ] bonjour, Je me suis créer un petit système d'upload d'imges pour un projet web. Une basse de donnée stock la liste complète des images avec leur noms


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,012 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales