La communauté ALL HTML c'est 60442 membres à ce jour dont 0 inscrits aujourd'hui et 5 depuis une semaine.

Upload et redimentionnement d'image

Photo de elizabeth Article publié le vendredi 29 juin 2007 par elizabeth.
Cet article est classé dans les catégories « PHP »

Ce tutoriel vous aide à uploader une image .jpg qui sera redimentionnée proportionnellement, avant d'être copiée sur le serveur, puis génèrera une miniature proportionnelle de cette image, le tout enregistré dans une base de données. Ce code est améliorable, j'aimerais pouvoir gérer les gifs aussi, avis aux pros....<br /> <br /> Petite fée.

mon code permet donc à l'internaute de charger un fichier jpg d'une taille maxi de 2048*2048 pixels.
cette image est renommée en fonction du timestamp de façon à être unique, et redimentionnée proportionnellement dans la taille que vous voulez, puis copiée dans un dossier que vous définissez également.
ensuite une vignette est générée proportionnellement dans la taille que vous voulez aussi, et copiée dans le dossier de votre choix.
elle est renommée du même nom que la grande (le timestamp) avec un "ptt" accolé pour être sur de ne pas se mélanger si un jour vous mettez tout dans le même dossier.
mon code ensuite incrémente ma base de donnée avec les noms de la petite et la grande image.

voici la hyérarchie de mon travail :
un dossier "Connections" contenant mon fichier de connexion anpot.php,
un dossier "admin" avec le fichier contenant code qui suit ci-dessous (upload.php) et un fichier ajout-confirm.php qui est appelé quand tout est exécuté avec succès
un dossier "sources" contenant le dossier "ptt" et "grd" .
ma base de donnée est nommée "image" avec les champs id, photoptt, photogrd.

voilà,
c'est un code imparfait et probablement maladroit, néanmoins il fonctionne bien et je serais ravie d'y apporter, grace à votre aide, les améliorations qui vous paraissent nécessaires, et notamment la possibilité de traiter aussi les sources en format gif (je suis preneuse si quelqu'un a une idée, j'ai pas réussi)

Merci à ceux qui m'ont aidé, et j'espère à mon tour faire des heureux....

<?php require_once('../Connections/anpot.php'); ?> <?php // //************************ pour l'upload *********************** // à enlever chez free : set_time_limit(0); // pour autoriser la taille d'upload au niveau du php.ini ini_set("post_max_size","52428800"); ini_set("memory_limit","52428800"); ini_set("upload_max_filesize","52428800"); //valeur en octets // Repertoire de stockage de la grande image, chemin par rapport au fichier d'upload (celui-ci) $dossier_grd = "../sources/images/grd"; // Repertoire de stockage de la petite image, chemin par rapport au fichier d'upload (celui-ci) $dossier_ptt = "../sources/images/ptt"; // Poids max autorisé par le serveur $MaxSize = 52428800; // Largeur max de l'image en pixels autorisé à l'upload $Maxwidth = 2048; // Hauteur max de l'image en pixels autorisé à l'upload $Maxheight = 2048; // Type de fichier autorisé : seulement les jpg (si vous savez autoriser les gifs ça m'intéresse) $ValidType = array("image/pjpeg"=>"jpg","image/jpeg"=>"jpg"); // nouveau nom de la grande image, ici en fonction du timestamp pour qu'il soit tjrs unique. $NomImage = time(); //*********************** fin pour l'upload ******************** $up1 = false; $up2 = false; $upload = false; //************************************************************** function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } $editFormAction = $_SERVER['PHP_SELF']; if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); } //************************************************************** photo ************* if (!empty($_POST['fichier'])) { $up1 = false; $up2 = false; // ******************* pour la grande photo ******** // Contrôle des messages d'erreur if(!isset($_FILES['fichier'])) exit("Fichier absent <br><br><a href='javascript:history.back()'>[Charger une nouvelle image]</a>"); if($_FILES['fichier']['size'] > $MaxSize) exit("Image trop lourde <br><br><a href='javascript:history.back()'>[Charger une nouvelle image]</a>"); $infos_img = getimagesize($_FILES['fichier']['tmp_name']); if(($infos_img[0] >= $Maxwidth) & ($infos_img[1] >= $Maxheight)) exit("Vous avez dépassé la dimension maximum autorisée qui est de $Maxwidth*$Maxheight pixels <br><br><a href='javascript:history.back()'>[Charger une nouvelle image]</a>"); $ext = ""; if(array_key_exists($_FILES['fichier']['type'],$ValidType)) $ext = $ValidType[$_FILES['fichier']['type']]; if(empty($ext)) exit("Type de fichier invalide <br><br><a href='javascript:history.back()'>[Charger une nouvelle image]</a>"); // Vérification de l'upload if(!move_uploaded_file($_FILES['fichier']['tmp_name'], $dossier_grd."/".$NomImage.".".$ext)) { exit("l'upload a échoué <br><br><a href='javascript:history.back()'>[Charger une nouvelle image]</a>"); }else{ // Création de la grande photo *************************************************************** $image_mini=$dossier_grd."/".$NomImage.".".$ext; $fichierSource = $image_mini; } // Définition du format de l'image if ($infos_img[0] > $infos_img[1] ) { // si la largeur est plus grande que la hauteur : Format paysage $largeurDestination = 440; $hauteurDestination = 440 * ($infos_img[1] / $infos_img[0]) ; }elseif ($infos_img[1] > $infos_img[0] ) { // si la hauteur est plus grande que la Largeur : Format portrait $hauteurDestination = 440; $largeurDestination = 440 * ($infos_img[0] / $infos_img[1]) ; }else if ($infos_img[1] == $infos_img[0] ) { // si la largeur est égale à la hauteur : Format carré $largeurDestination = 440 ; $hauteurDestination = 440; } //Crée l'image vide avec les dimensions $im = ImageCreateTrueColor ($largeurDestination, $hauteurDestination) or die ("Erreur lors de la création de l'image miniature"); //Prends l'image d'origine $source = ImageCreateFromJpeg($fichierSource); //Redimensionnement de L'image $largeurSource = imagesx($source); $hauteurSource = imagesy($source); //Création, enregistrement de l'image redimentionnée ImageCopyResampled($im, $source, 0, 0, 0, 0, $largeurDestination, $hauteurDestination, $largeurSource, $hauteurSource); $miniature = $fichierSource; ImageJpeg ($im, $miniature); ?> <?php $PhotoGrd=$NomImage.".".$ext; $up1=true; //**********************Génération de la petite vignette******************************************* if($up1 == true){ // copie dans repertoire pour les petites photos, et renomme la vignette en ajoutant ptt devant le nom de la grande : $NomImage = 'ptt'.$PhotoGrd; if (copy($dossier_grd."/".$PhotoGrd,$dossier_ptt."/".$NomImage)) { // Création d'une miniature $image_mini=$dossier_ptt."/".$NomImage; $fichierSource = $image_mini; } // Définition du format de l'image if ($infos_img[0] > $infos_img[1] ) { // si la largeur est plus grande que la hauteur : Format paysage $largeurDestination = 85; $hauteurDestination = 85 * ($infos_img[1] / $infos_img[0]) ; }elseif ($infos_img[1] > $infos_img[0] ) { // si la hauteur est plus grande que la Largeur : Format portrait $hauteurDestination = 85; $largeurDestination = 85 * ($infos_img[0] / $infos_img[1]) ; }else if ($infos_img[1] == $infos_img[0] ) { // si la largeur est égale à la hauteur : Format carré $largeurDestination = 85 ; $hauteurDestination = 85; } //Crée l'image vide avec les dimensions $im = ImageCreateTrueColor ($largeurDestination, $hauteurDestination) or die ("Erreur lors de la création de l'image miniature"); //Prends l'image d'origine $source = ImageCreateFromJpeg($fichierSource); //Redimensionnement de L'image $largeurSource = imagesx($source); $hauteurSource = imagesy($source); //Création, enregistrement de l'image miniature ImageCopyResampled($im, $source, 0, 0, 0, 0, $largeurDestination, $hauteurDestination, $largeurSource, $hauteurSource); $miniature = $fichierSource; ImageJpeg ($im, $miniature); ?> <?php $PhotoPtt=$NomImage; $up2=true; } else { echo "La copie du fichier $NomImage n'a pas réussi...\n"; } } // ********* enregistrement dans la base de donnée if ($up1 == true AND $up2 == true) { $upload = true; } if ($upload) { $_POST['photoptt'] = $PhotoPtt; $_POST['photogrd'] = $PhotoGrd; $insertSQL = sprintf("INSERT INTO image (id, photoptt, photogrd) VALUES (%s, %s, %s)", GetSQLValueString($_POST['id'], "int"), GetSQLValueString($_POST['photoptt'], "text"), GetSQLValueString($_POST['photogrd'], "text")); mysql_select_db($database_anpot, $anpot); $Result1 = mysql_query($insertSQL, $anpot) or die(mysql_error()); $insertGoTo = "ajout-confirm.php"; if (isset($_SERVER['QUERY_STRING'])) { $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?"; $insertGoTo .= $_SERVER['QUERY_STRING']; } header(sprintf("Location: %s", $insertGoTo)); } //*************************** ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>upload</title> <link href="../../styles.css" rel="stylesheet" type="text/css" /> <style type="text/css"> <!-- .Style2 {color: #000000} .Style3 { font-family: Georgia, "Times New Roman", Times, serif; color: #666666; font-weight: bold; font-size: 18px; } .Style10 { font-family: Georgia, "Times New Roman", Times, serif; color: #666666; } .titre {font-weight: bold} .Style14 {font-family: Georgia, "Times New Roman", Times, serif; color: #666666; font-weight: bold; font-size: 24px; } .Style17 {color: #990000; font-weight: bold; } --> </style> </head> <body> <span class="titre"><span class="Style10"><em>espace administrateur </em></span></span> <div align="center"><span class="sous-titre titre Style2"><br /> <span class="Style3">Ajout d'une photo </span> </span></div> <table width="729" height="441" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td><form action="<?php echo $editFormAction; ?>" method="post" enctype="multipart/form-data" name="form1"> <table align="center"> <tr valign="baseline"> <td colspan="2" align="right" nowrap>: : </td> </tr> <tr valign="top"> <td width="306" align="right" nowrap><strong>Photo</strong> (maxi 2048 pixels de long <span class="Style17">ou</span> de large) :</td> <td width="357"><input name="fichier" type="file" class="fields" size="25"></tr> <tr valign="top"> <td colspan="2" align="center" nowrap><br /> <p>&nbsp; </p> <p> <input type="submit" value="Insérer l'enregistrement"> </p></td> </tr> </table> <input type="hidden" name="MM_insert" value="form1"> </form> <p>&nbsp;</p></td> </tr> </table> </body> </html>

VOS COMMENTAIRES ...

Commenter cette publication

Photo de nours312 Commentaire publié le jeudi 17 janvier 2008 à 09 h 42 par nours312
salut et merci pour ce script !

je l'ai récupéré et modifié pour pouvoir utiliser les gif et png ...

le problème, c'est pour les autres formats : bmp, fhc, cod, ief, pbm, pgm, ...., certes ils sont moins utilisés, mais pourquoi etre discriminant ???

mis à part cela : j'ai un soucis lors de la création des vignettes JPEG, le fichier est créé aux dimensions normales (font noir : imagecreatetruecolor() ) et lors de la fonction imageJpeg(), les dimensions de la création sont mal interprétées ... et j'ai une vignette de 10*10 sur une image de 80*80 ... c'est pas terrible ... ça ne le fait que sur les petites image Jpeg ! ...

si tu as des idées ! ?


PS : je dois encore ajouter les fonctions pour la transparence des font (gif et png), ainsi que l'entrelacement des jpeg, et aprés je publierais le script !
Photo de elizabeth Commentaire publié le vendredi 18 janvier 2008 à 06 h 01 par elizabeth
je suis bien intéressée pour récupérer le code avec les gif et png, je n'y était pas arrivée !!!
je le veux bien, si ça ne t'ennuies pas...

pour les autres formats, c'est vrai que le but du script était d'uploader des images qui s'incrémentent dans une base de donnée pour s'afficher dans une pahe php, donc les formats non affichables par les navigateurs n'étaient pas nécessaires, et il y a un moment aussi ou le standard peut avoir du bon, il faut bien s'arrêter quelque part...

pour ce qui est de ton souci, ça ne fait pas ça chez moi, alors fais voir ton code ?
il est possible aussi que je me sois trompée et que je n'ai pas mis la dernière version quand j'ai fait le tuto ?

je vais vérifier le tuto avec mon code qui fonctionne...

je reviens

P'tite fée
Photo de elizabeth Commentaire publié le vendredi 18 janvier 2008 à 06 h 23 par elizabeth
non, je suis allée comparer minutieusement le code de mon tuto et celui que j'utilise, les seules différences que j'ai apporté après le tuto c'est l'autorisation de copie sur le serveur :
chmod("../sources/images/grd/" . $PhotoGrd, 0777);
avant $up1=true;
et
chmod("../sources/images/ptt/" . $PhotoPtt, 0777);
avant
$up2=true;
au moment de la copie sur le serveur.
ça n'a rien à voir avec ton souci,
donc il est possible, comme tu l'as dit dans un autre post au sujet d'autre chose, que quelque-chose ait sauté au cours de tes modifications.
j'espère avoir les compétences pour t'aider, si je peux, je le ferai volontier.
peux-tu poster ton code ?

@ +

P'tite fée
Photo de scud4 Commentaire publié le lundi 21 janvier 2008 à 09 h 27 par scud4
Bonjour,
j'ai besoin d'un peu d'aide pour la mise en place de ce script car chez moi, ça marche pas !!
J'ai remplacé le chemin de connection de la base par le mien, j'ai créé une table image avec des champs id, photoptt, photogrd et j'ai remplacé la connexion annot par la miennes :
mysql_select_db($database_connexion_BDD, $connexion_BDD); $Result1 = mysql_query($insertSQL, $connexion_BDD) or die(mysql_error());

J'ai aussi créé une page "ajout-confirm.php" pour verifier.


quand je vais chercher une image et que je clic sur enregistrer, la page se réactualise, ne passe pas à ma page "ajout-confirm.php" et n'enregistre ni les images dans mes dossiers ni dans la BDD.

Ou ai-je fais une erreur ??

Merci pour votre aide.
Photo de elizabeth Commentaire publié le mercredi 23 janvier 2008 à 07 h 24 par elizabeth
hello,
envoies-moi ton code en entier, sinon je ne peux pas t'aider....
tu peux m'envoyer directement ton fichier à mon adresse si tu veux :
contact@petite-fee.fr
je n'aurai qu'à remettre mes paramètres de connexion à la place des tiens pour vérifier si ça marche chez moi.

il y a plusieurs endroits où les chemins sont indiqués.
as-tu bien fait le changement partout ?
et si le formulaire ne passe même pas à ta page de confirmation, sans le code je ne peux pas deviner ce qui cloche...

à + tard,

p'tite fée
Photo de elizabeth Commentaire publié le mercredi 23 janvier 2008 à 07 h 26 par elizabeth
nours312, plus de nouvelles, tu as trouvé l'erreur ?
si oui c'est sympa pour les autres de venir donner la soluce, et j'avoue que je suis intéressée par la possibilité de récupérer d'autres formats d'images au départ.
est-il possible que tu nous fasse partager tes trouvailles ?

merci !!

P'tite fée
Photo de elizabeth Commentaire publié le vendredi 25 janvier 2008 à 06 h 49 par elizabeth
ben alors, ça pose des questions et ça revient pas dire si ça marche ou non ?
ça veut plus se faire aider ?
ben alors quoi ???
Photo de nours312 Commentaire publié le vendredi 25 janvier 2008 à 09 h 56 par nours312
Désolé, mais j'ai un taf montrueux !!!
si si ça fonctionne !

mis à part la gestion des transparent avec les gif et png, c'est pour ça que je ne me suis pas amusé à faire le cador en balençant un script qui fonctionne a peut prés !
http://www.allhtml.com/forums/posts_list/topic:506061

je suis aprés coder autre chose, et dès que j'ai un moment, je m'y remet !

si tu veux mon fichier, je peux te l'envoyer, mais il est "brut de décoffrage"

le soucis que j'avais avec les Jpeg est résolu, mauvais copier coller ...
http://www.allhtml.com/forums/posts_list/topic:506059


voila, sinon, mon script gères tous typs de fichiers ...
Si c'est une image, il l'a redimensionne et en cré une vignette, sinon, il stock ...
Mais j'en ai trouvé un excelent que tu peux tester :

http://nours312.info/freyssenet/fichier/
username : nours312
password : mypass

il n'est pas conçu pour les images en particulier, mais certainnes fonctions sont fascinantes !
tels que l'upload particulièrement !

je souhaitais attendre d'avoir digéré toutes ces fonctions pour t'envoyer un fichier en béton ...

si tu veux plus d'infos, envoye un mail ! c plus simple !

A bientot ! ;)
Photo de elizabeth Commentaire publié le vendredi 25 janvier 2008 à 10 h 07 par elizabeth
d'accord,
ton code m'intéresse, donc je suis preneuse, et je pense même qu'une publi serait sympa pour en faire profiter tout le monde.
je compte sur toi, alors ?

merci !!

P'tite fée
Photo de catcat Commentaire publié le vendredi 25 janvier 2008 à 12 h 52 par catcat
Merci pour ton code, il est très intéressant.

Je l'ai copié, ait modifié la connexion à la bdd, mais rien ne se passe quand je clique sur le bouton "insérez l'enregistrement".

Voici le code (je ne te renvoie que les lignes modifiées)

<code>
<?php include "connect.php" //ma connexion
// Repertoire de stockage de la grande image, chemin par rapport au fichier d'upload (celui-ci)
$dossier_grd = "../Images/grand";
// Repertoire de stockage de la petite image, chemin par rapport au fichier d'upload (celui-ci)
$dossier_ptt = "../Images/petit";

</code>

C'est tout ce que j'ai vu à modifier !

Ai-je oublié qq chose ?

Et peux tume dire si ce qui est + correct entre 'include' et 'require' ?

Merci et bonne journée

Cat
Photo de catcat Commentaire publié le vendredi 25 janvier 2008 à 14 h 27 par catcat
Honte à moi, je viens de voir que je veux enregistrer les photos sur un répertoire alors qu'elles sont dans une table de la bdd sur ton script.

Je corrige

Dsl
Photo de elizabeth Commentaire publié le mardi 29 janvier 2008 à 10 h 25 par elizabeth
pô grave
:o)
m'fait plaisir d'aider, pour une fois
merci d'utiliser mon code :o))))
Photo de Danito Commentaire publié le jeudi 07 février 2008 à 12 h 20 par Danito
Moi je comprend pas ton probleme de gif et png ?

tu veux les redimensionner a la manière des jpg ?

ou tu veux simplement les charger sur le serveur ?
Photo de elizabeth Commentaire publié le jeudi 07 février 2008 à 20 h 45 par elizabeth
juste pouvoir faire pareil qu'avec les jpg, c'est à dire les uploader, les redimentionner etc.
actuellement, ça ne fonctionne qu'avec les jpg.....

Commenter cette publication

Vous devez obligatoirement vous identifier en tant que membre pour participer à cette discussion.

Forums de discussions associés

Discutez et échangez sur ce thème dans notre forum PHP - SQL.

Liens sponsorisés

ACCÉS COMMUNAUTÉ

Rejoignez ALL HTML

Publiez vos articles, actualités, communiqués ... Donnez votre avis, partagez votre réseau, rencontrez d'autres membres et participez à la vie de la communauté.