Vous êtes ici Codes PHP et MySQL > Fonctions > Fonctions d'upload Multiples d'images avec...

 

Fonctions d'upload Multiples d'images avec creation de miniatures à la volée

Suite au script proposé d'upload multiple de fichiers,
j'ai ajouté la creation de miniatures à la volée.

Modification du script suivant :
http://cozop.com/koogar/upload_multiple_ou_simple_des_fichiers
 
mecano
Site de l'auteur voir
Code vu 6641 fois
Enregistré le 11 Déc 2008
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute Fonctions d'upload Multiples d'images avec creation de miniatures à la volée
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Fonctions d'upload Multiples d'images avec creation de... */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts475-PHP.htm              */
/* Auteur         : mecano                                                    */
/* Date édition   : 11 Déc 2008                                               */
/* Website auteur : http://www.mecanographik.fr/                              */
/*                                                                            */
/******************************************************************************/
  
/* ##############################################################
// Gestion des telechargements simples ou multiples de fichiers 
// sur le serveur distant 
// ############################################################ */


function FILE_UPLOADER($num_of_uploads=5$file_types_array=array('jpg',
                                                                  'gif',
                                                                  'png',
                                                                  'mp3',
                                                                  'bmp',
                                                                  'swf',
                                                                  'flv',
                                                                  'mpeg',
                                                                  'jpeg'),
                                      $max_file_size=1048576$upload_dir=""){
  if(!is_numeric($max_file_size)){
    $max_file_size 1048576;
  }
  $max_file_size_Mo $max_file_size/1048576;
  if(!isset($_POST['submitted'])){
    $form '<form action="'.$PHP_SELF.'" method="post"' .
' enctype="multipart/form-data">
    Telechargement de fichier:<input type="hidden" name="submitted"' .
' value="TRUE" id="'.time().'">
                              <input type="hidden" name="MAX_FILE_SIZE" value="'
.$max_file_size.'">';
    for($x=;$x<$num_of_uploads;$x++){
      $form .= '<input type="file" name="file[]"><font' .
' color="red">*</font><br /><br />';
    }
    $form .= '<input type="submit" value="Telecharger"><br /><font' .
' color="red">*</font>
               Type(s) de fichiers autorisés: ';
    $y=count($file_types_array);
  for($x=;$x<$y;$x++){
      if($x<$y-1){
        $form .= $file_types_array[$x].', ';
      }else{
        $form .= $file_types_array[$x].'.';
      }
    }
    $form .= '</form>';
    echo($form);
  }else{
  
    foreach($_FILES['file']['error'] as $key => $value){
    
      if($_FILES['file']['name'][$key]!=""){
        if($value==UPLOAD_ERR_OK){
        
          $origfilename $_FILES['file']['name'][$key];
          $filename explode('.'$_FILES['file']['name'][$key]);
          $filenameext $filename[count($filename)-1];
          unset($filename[count($filename)-1]);
          $filename implode('.'$filename);
          $filename substr($filename, , 15).'.'.$filenameext;
          $file_ext_allow FALSE;//par mesure de securité on suppose l'extenion
// du fichier fausse
      //verifions si notre fichier fait partie des types autorisés
      if(false !== ($iClef array_search($filenameext$file_types_array))) {
 $file_ext_allow TRUE;
}
          if($file_ext_allow){
            if($_FILES['file']['size'][$key]<$max_file_size){
              if(move_uploaded_file($_FILES['file']['tmp_name'][$key], 
$upload_dir.$filename)){
                echo('Transfert de fichier effectué avec succès. -
                      <a href="'.$upload_dir.$filename.'" target="_blank">'.
$filename.'</a><br />');
                      
                      /*On affiche ici le lien vers le fichier uploader
                      sur le serveur*/
                    
                   /*************************************/   
                  //La super fonction CREATION MINIATURES
                  /*************************************/
                  
                  //on nettoie le nom du fichier
                  // fonction clean à créer avec expressions regulières...
                  $destfilename=clean($filename);
                  
                  echo $destfilename;

                  $dest=$upload_dir.$destfilename.".tmp";
                  $destImg=$upload_dir.$destfilename;
                  $destMini=$upload_dir."mini/".$destfilename// Ici mon
// dossier MINI se trouve dans le dossier image principal
                                    
                //création de la miniature
                $img_in imagecreatefromjpeg($destImg);
                $srcX imagesx($img_in);
                $srcY imagesy($img_in);
                
                //infos du fichier config
                $largeurMiniatureImage=100;
                $hauteurMiniatureImage=100;
                
                $img_out imagecreatetruecolor($largeurMiniatureImage$hauteurMiniatureImage);
                $bgColor imagecolorallocate($img_out ,45 ,30 ,45 ); // fond
// mauve fonce : #2d1e2d
                imagefill($img_out,,,$bgColor);
                
                if (($srcX/$srcY)>($largeurMiniatureImage/$hauteurMiniatureImage
)) {
                    $ratio=$srcX/$largeurMiniatureImage;
                    $newX=;
                    $newHeight=($srcY/$ratio);
                    $newY=($hauteurMiniatureImage-$newHeight)/2;
                    imagecopyresampled($img_out,$img_in,$newX,$newY,,,
$largeurMiniatureImage,$newHeight,$srcX,$srcY);
                } else {
                    $ratio=$srcY/$hauteurMiniatureImage;
                    $newWidth=($srcX/$ratio);
                    $newX=($largeurMiniatureImage-$newWidth)/2;
                    $newY=;
                    imagecopyresampled($img_out,$img_in,$newX,$newY,,,$newWidth,
$hauteurMiniatureImage,$srcX,$srcY);
                }
                
                imagejpeg($img_out,$destMini);
                
                //redimentionnement si trop grand
                $largeurMaxImage=800;
                $hauteurMaxImage=600;
                
                if ($srcX>$largeurMaxImage $srcY>$hauteurMaxImage ) {
                    $ratioX=$srcX/$largeurMaxImage;
                    $ratioY=$srcY/$hauteurMaxImage;
                    
                    $ratio=max($ratioX,$ratioY);
                    
                    $img_out imagecreatetruecolor($srcX/$ratio$srcY/$ratio);
                    //$bgColor = imagecolorallocate($img_out ,255 ,255 ,255 );
// // fond blanc
                    $bgColor imagecolorallocate($img_out ,45 ,30 ,45 ); 
// fond mauve fonce : #2d1e2d
                    imagefill($img_out,,,$bgColor);
                    
                    imagecopyresampled($img_out,$img_in,,,,,$srcX/$ratio,$srcY/
$ratio,$srcX,$srcY);
                    
                    imagejpeg($img_out,$destImg);
                    
                    unlink($dest);
                } else // pas de redimentionnement
                    rename($destImg,$destImg);

                      //Fin script miniature
                      
              }else{
 echo('Une erreur est survenue lors du transfert de '.'<strong>'.$origfilename.
'</strong><br />');
              }
            }else{
 echo('La taille du fichier '.''.$origfilename.''.' excède les '.
$max_file_size_Mo.' Mo autorisé(s)');
            }
          }else{
 echo('Le fichier '.''.$origfilename.''.'  a une extension invalide, ERREUR' .
' DE TRANSFERT !<br />');
          }
        }else{
          echo('Une erreur est survenue lors du transfert de '.'<strong>'.
$origfilename.'</strong>');
        }
      }
    }
  }
}
?>


 

Fonctions du code

: Crée un tableau - (PHP 4, PHP 5)
: - (PHP 4, PHP 5)
: Détermine si une variable est affectée - (PHP 4, PHP 5)
: Retourne le timestamp UNIX actuel - (PHP 4, PHP 5)
: Compte le nombre d'éléments d'un tableau ou le nombre de propriétés...
: Affiche une chaîne de caractères - (PHP 4, PHP 5)
: Coupe une chaîne en segments - (PHP 4, PHP 5)
: Détruit une variable - (PHP 4, PHP 5)
: Rassemble les éléments d'un tableau en une chaîne - (PHP 4, PHP 5)
: Retourne un segment de chaîne - (PHP 4, PHP 5)
: Recherche dans un tableau la clé associée à une valeur - (PHP 4 >= 4.0.5, PHP 5)
: Déplace un fichier téléchargé - (PHP 4 >= 4.0.3, PHP 5)
: Crée une nouvelle image à partir d'un fichier ou d'une URL - (PHP 4, PHP 5)
: Retourne la largeur d'une image - (PHP 4, PHP 5)
: Retourne la hauteur de l'image - (PHP 4, PHP 5)
: Crée une nouvelle image en couleurs vraies - (PHP 4 >= 4.0.6, PHP 5)
: Alloue une couleur pour une image - (PHP 4, PHP 5)
: Remplissage - (PHP 4, PHP 5)
: Copie, redimensionne, rééchantillonne une image - (PHP 4 >= 4.0.6, PHP 5)
: Envoie une image JPEG vers un navigateur ou un fichier - (PHP 4, PHP 5)
: La plus grande valeur - (PHP 4, PHP 5)
: Efface un fichier - (PHP 4, PHP 5)
: Renomme un fichier ou un dossier - (PHP 4, PHP 5, PECL zip:1.1.0-1.4.1)
Commentaires
Salut, ton code est super. Pour ma part je suis constructeur de portails et de tous types d'applicaitons web. Je monte plussieurs fois par mois des app de gestion de fichier et images. Voici quelques trucs importants ici afin de pouvoir rendre le patern plus universel.

Voici donc quelques conseils (au cas où tu voudrais faire les correctifs, sinon je posteai ta source avec améliorations)

elle est cool à la base, très beau job.

ton $upload_dir est vide, alors que tu suggères que le rep "MINI" est dans "images". Faudrait l'indiquer. Indiques plutôt dans une variable en haut ton chemin pour la photo, puis aussi pour les miniatures.




Code:

$chemin_images ="images/";
$chemin_thumbs = $chemin_image."thumbs";

vérifies en premier lieu si ton client à un rep image sur son web ( ce qui est presque toutjours le cas)

Si oui, tu regardes alors si tua s les droits d'écrire sur le rep avec chmod 644.
Sinon, tu devras alors le créer, et lui donner les droits bien sûr.

Donnes les droits chmod 644 sur toutes tes images et minaitures 644, afin d'avoir les droits de supprimer les images via PHP par après. Pas tous les serveurs qui permettent les droits. Ca te donnerait le test pour voir si ton client ne va pas te rapppeler une heure plus tard pour te dire que ton app ne fonctionne pas.

Tu devrais préfixer les miniatures par "t-monimage.jpg" ou "min-monimage.jpg" au lieu de mettre dans un sous rep "MINI". Car ton client peur tout planter en transfèrant ses fichier via ftp par la suite, et copier dans le mauvais répertoire. Aussi, le cache des browser peuvent confondrent entre la vraie photo et la miniature en mémoire car elles portent le même nom.

Tu dois aussi mettre dans ton array le "JPG", "JPEG", et surtout "pjpeg" et "PJPEG" (car ce sont les nouveaux formats de jpeg mais pour l'impresion - soit du 300 dpi) tu dois pouvoir gérer ce format car tu trouveras de bug de dépassement de la mémoire de 32 megs alloués et GD cessera de fonctionner. Le traitement de jpg et de pjpeg sont très duifférents vu leur ppp et dpi.

Donc pas oubleir de mettre tant les extentions en minuscules qu'ne maguscules.

Tu fais appel dans le script de la fonction "clean", où est elle exactement?
Aussi , tu peux tout simplement éviter le clean des expressions en renommant la photo avec le temps actuel par exemple :



Code:

$new_nom = date("ymd").time().".jpg";

(et lui donner les droits 644)

Aussi la syntaxe est déffectueuse ici :
Warning: unlink(images/001109_0552_001.jpg.tmp) [function.unlink]: No such file or directory
cette image semble vouloir avoir deux extentions.......

Bref, regardes si tu veux faire les modifs, ou je mettrais les correctifs.

En gros, il sagit d'une beau job. Faut mettre plus de gestion de débugggage, mais sutout un ti script de test lorsque tu installe sur un client, question de voir où sont tes droits et tout et tout.



 
Aussi, ....en passant, une bonne méthode...pour ma part, est de toujours m'envoyer moi-même un courriel lorsque ca plante sur un client avec le code d'erreur, je stock ca dans ma bd distante pour consultation. Ainsi, le client m'appelle, et je suis déja en train de débugger son application.

Car j'en vend des cms et des galeries. Je dois m'assurer du fonctionnement parfait.

Car par exemple, il y a des moments où c'est pas évident. Car un site peut, question de transfère de serveur, perdre ses droits, erreures de transfères ou de pertes de connexion avec le serveur. Ca cause des troubles pas possibles. J'ai plus d'une centaine de clients avec des dispositifs ayant à faire appel aux uploads et gestions de fichiers. Une seule mise à jour de plateforme et tout peux planter. Je peux dès lors avec des courriel d'alerte voir à mon grain.....sans y mettre trop de blé. La version de GD sur le serveur est très importante, surtout avec les nouveaux formats de jpg à 300 dpi par défaut, le 32 megs de mémoire du serveur est insuffisant. Les codeurs devront bientôt jeter un oeil sur ca. Un véritable casse-tête est à venir pour des milleirs de codeurs, et je n'exagère pas du tout.

J'aime bien ta facon de coder, donnes moi plus de détails sur tes codes, j'y jetterai un coup d'oeil.

Bon travail.
 
Merci pour ces informations pertinentes. C'est vrai que la gestion des noms de fichier et leur extension est fondamentale. Je reviendrai sur ce code dès que j'aurai une minute, si tu souhaites contribuer à ce code par une nouvelle publication de celui-ci, n'hésites pas.
Il est vrai qu'on peut optimiser en début de code les variables de configuration pour plus de souplesse.

En ce qui concerne la fonction Clean la voici, elle sert à nettoyer les noms de fichiers et dossiers d'origine (j'ai remplacé un compact preg_replace par un fastidieux stripslashes(str_replace()) car certains hébergeurs tels que OVH n'avait pas l'air de tolérer la fonction preg_replace :




Code:
function clean($texte)
{
$texte = html_entity_decode($texte);

// ### MARCHE PAS AVEC OVH ###
// Définition des caractères accentués
$car_speciaux = array( ‘À’, ‘Á’, ‘Â’, ‘Ã’, ‘Ä’, ‘Å’, ‘Æ’, ‘à’, ‘á’, ‘â’, ‘ã’, ‘ä’, ‘å’, ‘æ’, ‘È’, ‘É’, ‘Ê’, ‘Ë’, ‘è’, ‘é’, ‘ê’, ‘ë’, ‘Ì’, ‘Í’, ‘Î’, ‘Ï’, ‘ì’, ‘í’, ‘î’, ‘ï’, ‘Ò’, ‘Ó’, ‘Ô’, ‘Õ’, ‘Ö’, ‘Ø’, ‘ò’, ‘ó’, ‘ô’, ‘õ’, ‘ö’, ‘ø’, ‘Ù’, ‘Ú’, ‘Û’, ‘Ü’, ‘ù’, ‘ú’, ‘û’, ‘ü’, ‘ß’, ‘Ç’, ‘ç’, ‘Ð’, ‘ð’, ‘Ñ’, ‘ñ’, ‘Þ’, ‘þ’, ‘Ý’, ‘€’ );
// … et de leurs “équivalents” non-accentués
$car_normaux = array( ‘A’, ‘A’, ‘A’, ‘A’, ‘A’, ‘A’, ‘A’, ‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘E’, ‘E’, ‘E’, ‘E’, ‘e’, ‘e’, ‘e’, ‘e’, ‘I’, ‘I’, ‘I’, ‘I’, ‘i’, ‘i’, ‘i’, ‘i’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘o’, ‘o’, ‘o’, ‘o’, ‘o’, ‘o’, ‘U’, ‘U’, ‘U’, ‘U’, ‘u’, ‘u’, ‘u’, ‘u’, ‘B’, ‘C’, ‘c’, ‘D’, ‘d’, ‘N’, ‘n’, ‘P’, ‘p’, ‘Y’, ‘E’ );
// On commence par supprimer les accents
//$texte = stripslashes(str_replace($car_speciaux, $car_normaux, $texte));

$texte = stripslashes(str_replace('é','e',$texte));
$texte = stripslashes(str_replace('è','e',$texte));
$texte = stripslashes(str_replace('ê','e',$texte));
$texte = stripslashes(str_replace('ë','e',$texte));
$texte = stripslashes(str_replace('à','a',$texte));
$texte = stripslashes(str_replace('â','a',$texte));
$texte = stripslashes(str_replace('@','a',$texte));
$texte = stripslashes(str_replace('ù','u',$texte));
$texte = stripslashes(str_replace('/','',$texte));
$texte = stripslashes(str_replace('"','',$texte));
$texte = stripslashes(str_replace('#','',$texte));
$texte = stripslashes(str_replace('*','',$texte));
$texte = stripslashes(str_replace('[','',$texte));
$texte = stripslashes(str_replace(']','',$texte));
$texte = stripslashes(str_replace('(','',$texte));
$texte = stripslashes(str_replace(')','',$texte));
$texte = stripslashes(str_replace(':','',$texte));
$texte = stripslashes(str_replace(';','',$texte));
$texte = stripslashes(str_replace(',','',$texte));
$texte = stripslashes(str_replace('|','',$texte));
$texte = stripslashes(str_replace('^','',$texte));
$texte = stripslashes(str_replace('!','',$texte));
$texte = stripslashes(str_replace('?','',$texte));
$texte = stripslashes(str_replace('&','et',$texte));
$texte = stripslashes(str_replace('¤','',$texte));
$texte = stripslashes(str_replace('°','',$texte));
$texte = stripslashes(str_replace('#','',$texte));
$texte = stripslashes(str_replace('"','',$texte));
$texte = stripslashes(str_replace('$','',$texte));
$texte = stripslashes(str_replace('+','',$texte));
$texte = stripslashes(str_replace('=','-',$texte));
$texte = stripslashes(str_replace('%','',$texte));
$texte = stripslashes(str_replace('€','Euros',$texte));

//On retire les espaces
$texte = stripslashes(str_replace(' ','',$texte));

// On remplace les caractères non-alphanumériques par le séparateur
// ### MARCHE PAS AVEC OVH ###
//$texte = preg_replace( “/[^A-Za-z0-9]+/”, “-”, $texte );

// On supprime le séparateur s’il se trouve en début ou fin de chaîne
$texte = trim( $texte, “-”);

// On limite la chaine à $max_caracteres caractères (ici 50 caractères)
$texte = substr( $texte, 0, 50 );

// On convertit le tout en minuscules
$texte = strtolower($texte);

// On retourne le résultat
return ($texte);
};


 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 
Librairie PHP

Connexion

 
 

Fonctions

 
 

PHP

 
 
 
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité