8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'utilise dans une interface d'administration d'un site un script permettant d'uploader une photo, la redimensionner, puis en ajax (asynchrone) créer 3 vignettes de dimensions différentes.

J'envoie 3 photos en POST dans le même formulaire, volumineuses (2 ou 3 Mo chacune), et les images sont traitées avec move_uploaded_file, puis imagecreatefromjpeg, imagecreatetruecolor, imagecopyresampled.

Sur le serveur (dédié), j'ai augmenté très copieusement les valeurs upload_max_filesize, post_max_size, memory_limit, max_execution_time et max_input_time.

Le script tourne jusqu'au bout, m'envoie les messages de retour attendus (photo copiée, redimensionnée, etc), mais j'ai systématiquement un problème avec la 2ème photo (bande grise plus ou moins étendue en bas de l'image).

Bizarrement, la 3ème photo passe toujours bien.

J'ai pensé que ma 2ème image était corrompue : même en inversant les images, c'est toujours la 2ème qui pose problème.

Pour info, la fonction de redimensionnement (pour la lisibilité, j'ai supprimé les vérifications) :
function resizePhoto($name_filephoto, $photoDir, $photoLargeurMax, $photoHauteurMax, $prefixePhoto, $hauteurFixe = '', $largeurFixe = '') {
	
	$image = $name_filephoto;   
	$source = $photoDir;
	$destination = $photoDir;
	$size = getimagesize($source.$image);
	$largeur_src=$size[0];
	$hauteur_src=$size[1];

	$image_src=imagecreatefromjpeg($source.$image); 
	 
	$ratio = ajoutPhoto::ratio($photoLargeurMax, $photoHauteurMax, $largeur_src, $hauteur_src, $hauteurFixe, $largeurFixe);
	 
	if($ratio!=1) { // si ratio != 1
		$image_dest=imagecreatetruecolor(round($largeur_src*$ratio), round($hauteur_src*$ratio));
		imagecopyresampled($image_dest,$image_src,0,0,0,0,round($largeur_src*$ratio),round($hauteur_src*$ratio),$largeur_src,$hauteur_src);
		imagedestroy($image_src);
	  
		if(!imagejpeg($image_dest, $destination.$prefixePhoto.$image)){ 
		$result = "<p>le dimensionnement de la photo $image a &eacute;chou&eacute;. R&eacute;essayez dans quelques minutes. Si le probl&egrave;me persiste, contactez le webmaster.<br />destination = ".$destination.$prefixePhoto.$image."</p> \n <hr /> \n "; 
		}
	  
		else {
			imagedestroy($image_dest);  
			chmod($destination.$prefixePhoto.$image, 0775);
			$result = "<p>Photo $image redimensionn&eacute;e </p> \n";
		}
	}
	else { // si ratio = 1
		chmod($destination.$prefixePhoto.$image, 0775);
		$result = "<p>la photo est au format, elle n'a pas &eacute;t&eacute; redimensionn&eacute;e.</p> \n <hr /> \n ";
	}
	echo $result;
}


Won't you please, please help me ? (The Beatles)

Merci ...
Modifié par migli (03 Jun 2010 - 11:11)
Hello,

Je ne saurais pas te dire l'origine du problème, mais voici plusieurs pistes :

- Si l'image n'est pas redimensionnée, tu ne fais pas de imagedestroy($image_src); Je ne sais pas si c'est nécessaire, mais ça sera toujours un peu de mémoire libérée.

- Re-check tes images pour vérifier si elle ne sont pas corrompues (encore une fois). Vérifie que ce sont bien des JPG, pas des png avec une extension jpg. Essaie de n'uploader qu'une image à la fois, pour voir si ça passe.

- Sinon, un bon moyen de t'assurer que tu ne traite qu'une image à la fois avec toutes tes ressources est de faire un upload asynchrone (comme sur GMail). Pour ca il te faudra regarder du cote de SWFUpload (il y a un plugin jQuery pour traiter avec facilement si tu utilise jQuery).
Ca te permettrai d'uploader tes images dès que l'utilisateur la selectionne, et de retourner en AJAX la miniature directement.
a écrit :
Re-check tes images
De ce côté, je suis sûr. J'utilise 3 images A,B,C, si je les uploade dans cet ordre c'est la B qui ne passe pas, si je fais par exemple B,A,C, c'est la A qui ne passe pas.

a écrit :
faire un upload asynchrone
Effectivement ça serait une possibilité, mais en fait mon objectif est que l'utilisateur puisse remplir un formulaire unique avec photos et informations diverses, puis que les données soient traitées à l'envoi du formulaire sans étape intermédiaire (1 seul clic). Je ne veux pas qu'il soit obligé d'uploader les photos avant de valider.

a écrit :
utilise phpthumb, tu gagnera du temps
Excellent, merci, je ne connaissais pas. Je suis sur d'autres travaux pour l'instant mais dès que possible je vais revoir ça de près.