Upload de fichier image redimensionné en .jpg

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Upload de fichier image redimensionné en .jpg

par zest » 18 avr. 2008, 12:18

:D Après maintes recherches(merci Google!! et AB), une bonne nuit de sommeil et parce que je suis Maitre phpinfo() :wink: j'ai solutionné le problème de cette façon:
<?php
if( isset($_POST['valpost']) ){ // si formulaire soumis
    $target = 'images/'; // dossier où sera déplacé le fichier
    $tmp_file = $_FILES['fileimage']['tmp_name'];
    if( !is_uploaded_file($tmp_file) ){
        exit("Le fichier est introuvable");
    }
    // on vérifie maintenant l'extension
    $type_file = $_FILES['fileimage']['type'];
    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') ){
        exit("Le fichier n'est pas une image");
    }
    // on copie le fichier dans le dossier de destination
    $name_file = $_FILES['fileimage']['name'];
	$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
	$path_file= $real.'site_1/'.$target.$name_file;
	// On récupère les dimensions du fichier 
	$infos_img = getimagesize($_FILES['fileimage']['tmp_name']);
    if( !move_uploaded_file($tmp_file, $target . $name_file) ){
        exit("Impossible de copier le fichier dans $content_dir");
	}else{
		//poids maximum en octet
		$max_size = 100000;
		//largeur maximale en pixel
		$width_max = 425;
		//hauteur maximale en pixel
		$height_max = 425;
		//Retourne la largeur d'une image
		$imgWidth = $infos_img[0];
		//Retourne la longueur d'une image
		$imgHeight = $infos_img[1];
		//Facteur largeur/hauteur des dimensions max
		$whFact = $width_max/$height_max;
		//Facteur largeur/hauteur de l'original
		$imgWhFact = $imgWidth/$imgHeight;
		//fixe les dimensions du thumb
		if($whFact < $imgWhFact){//Si largeur déterminante
			$thumbWidth = $width_max;
			$thumbHeight = round($thumbWidth/$imgWhFact);
			} else { //Si hauteur déterminante
					$thumbHeight = $height_max;
					$thumbWidth = round($thumbHeight*$imgWhFact);
			}
		//Crée le thumb (image réduite)
		$imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight);
		//création de la nouvelle image à partir de l'URL $chemin_complet
		$imageresize = imagecreatefromjpeg($path_file);
		// redimension  et rééchantillonnage de la nouvelle image
		imagecopyresampled($imgThumb, $imageresize, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight);
		//Insère l'image de base redimensionnée
		imagejpeg($imgThumb, $path_file, 70);
		//Tous pour le propriétaire, lecture et exécution pour les autres
		chmod("{$target}{$nomImage}",0755);
		//on libère de la mémoire
		imagedestroy($imgThumb);
   	echo "Le fichier a bien été uploadé";
	}
}
?>
et le formulaire

Code : Tout sélectionner

<form enctype="multipart/form-data" method="post" action="upload.php"> <input type="file" name="fileimage" size="40"> <input type="submit" name="valpost" value="Uploader" onclick="submit()" /> </form>
et ça fonctionne impécable :D
On peut toujours l'améliorer avec la gestion des .png etc...

Merci à tous

EDIT
Je rajoute un petit plus...IE à une façon différente de gérer le cache que Firefox. Pour résoudre ce problème qui gêne en général l'affichage, je fais comme ça:
echo '<img src="'.$target . $name_file.'?'.time().'"/>';

par AB » 18 avr. 2008, 01:01

A part ça, après imagejpeg() fait un imagedestroy($imgThumb); ça libère la mémoire et ça te sera très utile si tu veux faire plusieurs upload-redimensionnement en même temps (dans une boucle)

Edit : et peut-être va faire un tour sur le tuto d'upload de ce site, il est indiqué les problèmes et éventuellement comment les résoudre pour les gros fichiers. ça dépend de la config de ton serveur, mais maintenant que tu es maitre du php info ça te poseras pas de pb :)

par AB » 18 avr. 2008, 00:52

Dans imagejpeg() également, il faut indiquer le chemin complet (le même que dans imagecreatefromjpeg()) :wink:

Sinon après plusieurs tests j'emploie la qualité 87 (au lieu de 70) qui correspond environ à "qualité supérieur" dans un logiciel de traitement d'image. Enfin ça c'est à toi de voir la qualité que tu veux...

par zest » 18 avr. 2008, 00:29

ben je cale et je crois que le problème viens de ces 2 lignes:
imagejpeg($imgThumb, '{$target}{$nomImage}', 70);
chmod('{$target}{$nomImage}',0755);
j'ai un fichier {$target }{$nomImage} qui apparait à la raçine !!??
...
en local je n'ai aucun problème!!!!
Pourtant il n'y a qu'un niveau d'arborescence d'écart!!
$chemin_complet = $real.'site_1/'.$target.$nomImage;//serveur distant
$chemin_complet = $real.$target.$nomImage;//localhost
Y a-t -il des manips à faire sur le php.ini ?
Je suis chez OVH....

par AB » 18 avr. 2008, 00:21

Je comprend pas ce que tu dis puisque pour être redimensionnée l'image doit être préalablement uploadée :?:

La logique du code c'est
if(move_uploaded_file($_FILES['fileimage']['tmp_name'],$chemin_complet)){ 

script de redimensionnement 

}
et normalement le chemin que tu indique pour move_uploaded_file() est le même que pour
imagecreatefromjpeg(). S'il est bon pour imagecreatefromjpeg() il doit l'être également pour move_uploaded_file()

Note : IL est possible qu'il faille aménager ce chemin suivant que tu es en local ou sur un serveur distant

Sur un distant normalement tes fichiers sont sur www donc dans ce cas le code précédent que je t'ai
donné fonctionne tel quel.
En local, si tu as plusieurs sites il faut indiquer en plus le chemin du dossier qui contient ton site.

Enfin bon tu l'a compris, c'est juste une histoire de trouver son chemin depuis l'endroit où l'on se trouve. Fais des essais en faisant des echo à plusieurs endroits et pour aller plus vite fais le sur une page séparée sans le reste du code (une bonne méthode pour débugguer)

par zest » 17 avr. 2008, 23:42

echo $real; //donne   /home/evonz/www/
echo $target.$nomImage; // donne   images/fcl038.jpg
Au fait sur ton serveur distant il faut bien sûr également mettre ce même chemin complet dans move_uploaded_file()
...c'est fait...l'image est bien "resized" (je l'affiche sur ma page web), mais elle n'est pas uploadée!!

par AB » 17 avr. 2008, 23:21

echo $real donne quoi ?

Au fait sur ton serveur distant il faut bien sûr également mettre ce même chemin complet dans move_uploaded_file()

par zest » 17 avr. 2008, 22:56

en fait je veux uploader les images dans le repertoire:
www/site_1/images
Je fais ceci...
$target = "images/";
...
$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
...
$nomImage = 'fcl0'.($rslt['idpost']+1).'.'.$extension;
$chemin_complet = $real.'site_1/'.$target.$nomImage; 
...
$imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight);
$imageresize = imagecreatefromjpeg($chemin_complet);
imagecopyresampled($imgThumb, $imageresize, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight);
imagejpeg($imgThumb, "{$target }{$nomImage}", 70);
...
Et...ça ne marche pas...quelque chose m'échappe |*()

Edit: tiens je viens de passer Maitre du phpinfo() :roll:

par AB » 17 avr. 2008, 22:28

D'ailleurs c'est étonnant que ton upload fonctionne sur un serveur distant.

Pour obtenir la bonne adresse par rapport au fichier sur lequel tu te trouve je fais ça
$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
Donc si ce code que tu exécute est sur une page à la racine de ton site (www) et que tu veux stocker ou re dimensionner dans un dossier "dossier_image" (également à la racine de ton site) avec comme nom de fichier "mon_image.jpg" cela devrait donner
$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
$chemin_complet = $real.'dossier_image/mon_image.jpg';
Edit : Ah bah j'étais entrain de répondre à ta question avant que tu me l'ai posée :lol: :lol:

par zest » 17 avr. 2008, 22:27

$imageresize = imagecreatefromjpeg($target.$nomImage);
imagecopyresampled($imgThumb, $imageresize, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight);
Ça marche très bien en localhost (merci :D ), mais impossible de uploader un fichier vers le repertoire du serveur qui porte le même nom!!??

Et je n'ai pas de message d'erreur :?

par AB » 17 avr. 2008, 22:05

En toute logique c'est la même adresse que là ou tu l'a mise avec move_uploaded_file()

Donc dans ton exemple cela devrait être $target.$nomImage (si toutefois le téléchargement a bien réussi avec cette adresse)

par zest » 17 avr. 2008, 21:56

Ouais c'est exactement ça!!!

Mais je n'arrive pas à récuperer le chemin exact....

la variable $tmp ne convient pas!!-->c:/wamp/tmp\phpB5.tmp

Quelle variable récuperer avec le path entier de l'image ?

par AB » 17 avr. 2008, 21:41

Le message d'erreur est parlant : "failed to open stream: No such file or directory in..."

Tu n'indiques pas la bonne adresse pour ton image. Il ne suffit pas d'indiquer le nom du fichier mais le chemin complet.

par zest » 17 avr. 2008, 21:15

Effectivement il me semble que c'est la solution, l'image est redimensionnée, mais elle est toute noire :?
Je dois manquer quelques chose!!!

J'ai toujours l'erreur:
Warning: imagecreatefromjpeg(linux-1024x768.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in
...je viens de m'apercevoir que upload_tmp_dir n'est pas définie chez mon hebergeur dans php.ini
En local c'est OK!
Est-ce que ça peut gêner?

par AB » 17 avr. 2008, 20:53

IL me semble avoir lu qu'il faut impérativement télécharger l'image sur le serveur avant d'effectuer le redimentionnement. En employant cette dernière méthode ça marche sans pb. Cela ne t'empêche d'ailleurs pas d'enchainer le chargement puis le redimentionnement en une seule fois.