Upload photo avec rediment. pixels, kb, ...

Description

Bonjour,

Ce script permet d'uploader des photos jpg sur un serveur FTP.
L'image est automatiquement redimentionnée et compressée pour obtenir une photo finale
enregistrée sur le serveur en fonction des paramètres définits par le webmaster.
L'image est ensuite sauvée dans un dossier créé avec le pseudo (avec cookie de reconnaissance) de l'expéditeur.

Paramètres modifiables:

- Taux de compression JPG (défaut 90)
- Taille max de l'image à uploader (défaut 5Mb)
- Taille max de l'image finale(défaut 70kb)
- Largeur de la photo finale(défaut 500px)
- Mail de notification

Je suis bien sûr ouvert à tous commentaires ;o)

Bouillou

Source / Exemple :


<?
//Cookies du pseudo
//*****************

$pseudo = $_POST['pseudo'];

//Enregistre le pseudo actuel
if(($pseudo != "")&&($pseudo != "Anonyme"))setcookie ("cookie_rep", $pseudo, time()+3600*24*365); //valable 1 année

//Lecture du pseudo
$cook_rep= $HTTP_COOKIE_VARS["cookie_rep"];
if(!isset($cook_rep))$cook_rep = "Anonyme";
if($pseudo == "")$pseudo = $cook_rep;
?>

<?php 
//--------------------------------------------------------------------------------- 
// Script réalisé par Bouillou sur la base du script d'upload simple de Webdeb73
// Ajout de Bouillou: Vérification de l'existance du fichier, notification par mail,
//                    modification des droits d'accès des images (CHMOD 640 --> 644)
//                    suppression des accents, redimentionnement automatique des 
//                    dimensions et de la taille de l'image, cookies du pseudo,
//                    images classées sur le serveur par pseudo,...
// Modifié le 20/05/2006 
// Version 1.2
// http://www.jeunessebottens.com
//----------------------------------------------------------------------------------

//---------------------------- 
//  DEFINITION DES VARIABLES  
//---------------------------- 

//Pour les tester en local (avec EasyPHP,...)
$test_local = 1; //0 pour le web													//N'effectue pas la réalocation de la mémoire du serveur
																													//et n'envoi pas de mail de confirmation

$extension  = 'image/pjpeg';                              // MIME JPEG pour la comparaisond de l'extention du fichier
$extension2 = 'image/jpeg';                               // MIME JPEG pour la comparaisond de l'extention du fichier
$quality    = 90;                                         // Qualité de la compression JPEG
$kb_max     = 70000;                                      // Valeur max en octets de l'image finale
$max_size   = 5000000;                                    // Taille max en octets du fichier à uploader pour traitement 
$largeurDestination = 500;                                // Largeur max de l'image finale en pixel
$nom_rep    = "images_upload";                            // Lien du répertoire des dossier photos à la raçine du script (fin sans /)
$site       = "http://".$_SERVER["HTTP_HOST"]."/upload_avec_traitement_serveur/"; // Adresse du dossier où est installé le script (fin avec /)
$mail_notif = "mom_mail@mail.com";                        // Adresse mail pour la notification
$mail_from  = "From: info@mail.com";                      // Adresse mail envoi

//--------------------------------------------- 
//  DEFINITION DES VARIABLES LIEES AUX FICHIERS 
//--------------------------------------------- 

$nom_file     = $_FILES['fichier']['name']; 
$taille       = $_FILES['fichier']['size']; 
$tmp          = $_FILES['fichier']['tmp_name'];
$ext_img			=	$_FILES['fichier']['type'];
$lien_dossier = $nom_rep;
$nom_rep     .= "/".strtolower($pseudo);
$verif_exist  = $nom_rep;
$verif_exist .= "/";
$verif_exist .= $nom_file;
       
//---------------------- 
//  SCRIPT D'UPLOAD 
//----------------------                     

//Vérifie l'existance du dossier de réception
//*******************************************
if(!file_exists($lien_dossier))
  {
   //Crée le répertoire de classement des photos s'il n'existe pas
   if(!mkdir($lien_dossier,0755))
     {
     	echo "Impossible de créer le répertoire : ",$lien_dossier," --> upload interrompu!!!";
     	exit;
     }        
  }  
            	 
//Enlever les accents
//*******************
function enlever_accents($dest_fichier){
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ/', 
                                     'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy/');
//remplacer les caracteres autres que lettres, chiffres et point par _
$dest_fichier = preg_replace('/([^.a-z\/0-9]+)/i', '_', $dest_fichier);
return $dest_fichier;
}

$nom_rep     = enlever_accents($nom_rep);
$pseudo      = enlever_accents($pseudo);
$verif_exist = enlever_accents($verif_exist);
$nom_file    = enlever_accents($nom_file);

//Début de la procédure d'upload
//******************************       
if(!empty($_POST['posted'])) { 
    // On vérifie si le champ est rempli 
    if(!empty($nom_file) && (!empty($pseudo))) { 
      //On vérifie que le nom du fichier n'existe pas
      if(!file_exists($verif_exist)) { 
        // On vérifie l'extension du fichier 
        if(($ext_img == $extension)||($ext_img == $extension2)) { 
           // On récupère les dimensions du fichier 
           $infos_img = getimagesize($tmp); 
            // On vérifie la taille de l'image 
            if($taille <= $max_size) { 
            //Crée le répertoire avec le pseudo
            if(!file_exists($nom_rep)){
            	 mkdir($nom_rep,0755);
            	 }
               //upload du fichier
               if(move_uploaded_file($tmp,$nom_rep."/".$nom_file)) { 
                    // Si upload OK alors on affiche le message de réussite 
                    chmod($verif_exist, 0644);
                    echo "<b><font color=red>Merci $pseudo!</font></b><br><br>"; 
                    echo '<b><font color=red>Image uploadée avec succès !</font></b><br>'; 
                    echo '<hr />';
                    echo '<u>Détails de l\'image</u><br>'; 
                    echo '<b>Fichier :</b> ', $nom_file , '<br />'; 
                    echo '<b>Taille :</b> ' , $taille, ' Octets<br />'; 
                    echo '<b>Largeur :</b> ', $infos_img[0], ' px<br />'; 
                    echo '<b>Hauteur :</b> ', $infos_img[1], ' px<br />'; 
                    echo '<hr />'; 
                    
                    //calcul et redimension
                    //*********************
                    $fichierSource  = $nom_rep;
                    $fichierSource .= "/";
                    $fichierSource .= $nom_file;  
                    $fichierSource  = $fichierSource;
                    //hauteur / largeur 
                    $rapport = $infos_img[1] / $infos_img[0];
                    //Dimension de sortie
                    $hauteurDestination = $largeurDestination * $rapport; 
                    
                    if($test_local == 0)
                      {
                       //Réaloue la mémoire dont le serveur à besoin
                       //*******************************************
                       $memoryNeeded = round(($infos_img[0] * $infos_img[1] * $infos_img['bits'] * $infos_img['channels'] / 8 + Pow(2, 16)) * 1.65);
                       $mem_in_use= memory_get_usage();
                       //echo "Mémoire utilisée : $memoryNeeded contre $mem_in_use<br><br>";
                       $test = (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) + 1;            
                       //solution calculée
                       if(function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2))               
                           ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) + 2 . 'M');
                      }
                     
                    //Création de l'image
                    //*******************
                    $source = imagecreatefromjpeg($fichierSource); 
                     
                    $largeurSource = imagesx($source); 
                    $hauteurSource = imagesy($source);
                                       
                    if($largeurSource > $largeurDestination){
                       $im = ImageCreateTrueColor ($largeurDestination, $hauteurDestination)      
                            or die ("Erreur lors de la création de l'image");  
                    }
                    else{  
                       $im = ImageCreateTrueColor ($infos_img[0], $infos_img[1])
                            or die ("Erreur lors de la création de l'image");
                       $largeurDestination = $infos_img[0];
                       $hauteurDestination = $infos_img[1];     
                    }
                       
                    //Redimentionnement
                    //***************** 
                    ImageCopyResampled($im, $source, 0, 0, 0, 0, $largeurDestination, $hauteurDestination, $largeurSource, $hauteurSource);                                                                                    
                    
                    //Création du fichier de sortie
                    //*****************************
                    $fh=fopen($fichierSource,'w');
                    fclose($fh);
                    ImageJpeg ($im,$fichierSource,$quality);
                    $size_file = filesize($fichierSource);
                    
                    //Test de la taille en kb de l'image définitive
                    //*********************************************
                    $size_file = filesize($fichierSource);
                    $iteration = 0;
                    while($size_file > $kb_max){
                    	 if($quality > 0)$quality -= 5;
                    	 else {$quality = "Erreur!!!"; break;}
                       unlink($fichierSource);
                       $fh=fopen($fichierSource,'w');
                       fclose($fh);
                       ImageJpeg ($im,$fichierSource,$quality);
                       $size_file = filesize($fichierSource);
                       $iteration++;
                    }
                    
                    //Affiche le détail de l'image
                    echo '<u>Détails de l\'image finale sur le serveur</u><br>'; 
                    echo '<b>Fichier :</b> '  , $nom_file, '<br />'; 
                    echo '<b>Taille :</b> '   , $size_file, ' Octets<br />';
                    echo '<b>Qualité :</b> '  , $quality, ' %<br />'; 
                    echo '<b>Largeur :</b> '  , $largeurDestination, ' px<br />'; 
                    echo '<b>Hauteur :</b> '  , $hauteurDestination, ' px<br />';
                    echo '<b>Itération de compression :</b> ', $iteration, ' x <br />'; 
                    echo '<hr />'; 
                                       
                    $lien_image = $site.$nom_rep."/".$nom_file;                  
                    echo "L'image ci-dessous a été redimentionnée et chargée sur le serveur.<br>Un mail de notification a été envoyé aux webmasters<br><br>";
                    //echo "Lien de l'image : ".$lien_image."<br /><br />";
                    echo "<img border='0' src='".$lien_image."'><br />";
                    
                    if($test_local == 0)
                      {
                       //Envoi du mail de notification
                       $message = "Lien de l'image: ";                     
                       mail($mail_notif, "Nouvelle img uploadée de ".$pseudo,$message.$lien_image,$mail_from);  
                      }
                       
                } else { 
                    // Sinon on affiche une erreur système 
                    echo '<font color=red><b><u>ECHEC DE L\'ENVOI</u><br><br>Problème lors de l\'upload !</b><br /><br /><b>Erreur num : ', $_FILES['fichier']['error'], '</b><br /><br /></font>'; 
                }
            } else { 
                // Sinon on affiche une erreur pour les dimensions et taille de l'image 
                echo "<b>La taille du fichier dépasse la taille maximale authorisée de $max_size octets!</b><br /><br />"; 
            }    
        } else { 
            // Sinon on affiche une erreur pour l'extension 
            echo '<font color=red><b><u>ECHEC DE L\'ENVOI</u><br><br>Votre image ne comporte pas l\'extension .jpg !</b><br /><br /></font>'; 
        }
      } else {
        	  //Sinon on demande de renommer
        	  echo '<font color=red><b><u>ECHEC DE L\'ENVOI</u><br><br>Une image avec le même nom existe déjà! Renommer la photo et réessayer, Merci.</b><br /><br /></font>'; 
       } 	     
    } else { 
        // Sinon on affiche une erreur pour le champ vide 
        echo '<font color=red><b><u>ECHEC DE L\'ENVOI</u><br><br>Aucune photo sélectionnée ou aucun pseudo entré!</b><br /><br /></font>'; 
    } 
} 
?>
      
 <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> 
 <b>Envoyer le fichier :</b><br /><br />
 <input type="hidden" name="posted" value="1" /> 
 <font color="#FFFFFF">Votre pseudo : </font><input name="pseudo" type="text" value="<?php echo $pseudo ?>" size="20" ><br><br> 

 <font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sélectionner la photo : </font><input name="fichier" type="file"><br><br> 
 <input type="submit" value="Envoyer la photo" /> 
 </form>

Codes Sources

A voir également

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.