Téléchargement
illégal
Posez votre question Signaler

Redimensionner une image lors d'un upload

morgan24 176Messages postés 1 octobre 2007Date d'inscription 16 août 2011Dernière intervention - Dernière réponse le 2 nov. 2010 à 02:21
Bonjour,
J'ai un petit site internet d'annonces avec photos, le problème est que lorsque un membre dépose une photo trop lourde, ça plante ...
Je suis à la recherche d'un script pour redimensionner automatiquement une image/photo lorsque le membre veut insérer une image dans son annonce
Merci pour votre aide
Lire la suite 

Redimensionner une image lors d'un upload »

12 réponses
Réponse
+1
moins plus
Bonjour,

Je ne vois pas a quoi cela pourrait servir... (Pourquoi programmer alors que l'on peux informer)

Il suffit de mettre un message au niveau du formulaire :
Attention ce serveur n'accepte pas des fichiers dont la taille est supérieur à 500ko (par exemple)

Dans votre formulaire qui upload placer ce code :
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />
Vous bloquez ainsi les photos qui sont au dessus de ce poids.
(500000 octets environs 500Ko).

Cordialement
Ajouter un commentaire
Réponse
+1
moins plus
Cadeau :)
Petit script perso de redimentionement d'image.
l'image garde son ratio d'aspect.

Je te conseil de faire des test:
-l'image est copié,
-l'image "image.png" est redimensionné en petit et en grand avec des tag "MINI_images.png" et "BIG_image.png"
-et peut etre d'autre fonction qui ne te serront pas forcement utilies.

utilisation:
<?php resize_clone("/ton/chemin/vers/ton/", "image.png");
n'oublie pas le "/" a la fin du chemin

Bonne chance :)

<?php
function resize_clone($path, $file)
{
	list($width, $height, $type, $attr) = getimagesize($path.$file);
	$ratio = $height / $width;
	if ($height > 500 OR $width > 500)
	{
		if($ratio <= 1)
		{
			$x = 500;
			$y = 500*$ratio;
		}
		else
		{
			$y = 500;
			$x = 500*(1/$ratio);
		}
	}
	else
	{
		if($ratio <= 1)
		{
			$x = $width;
			$y = $width*$ratio;
		}
		else
		{
			$y = $height;
			$x = $height*(1/$ratio);
		}
	}
	$size = getimagesize($path.$file);
	if ( $size)
	{
		if ($size['mime']=='image/jpeg' )
		{
			$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagejpeg($img_mini,$path."big_".$file );
		}
		elseif ($size['mime']=='image/png' )
		{
			$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagepng($img_mini,$path."big_".$file );
		}
		elseif ($size['mime']=='image/gif' )
		{
			$img_big = imagecreatefromgif($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagegif($img_mini,$path."big_".$file );
		}
	}
	if($ratio <= 1)
	{
		$x = 90;
		$y = 90*$ratio;
	}
	else
	{
		$y = 90;
		$x = 90*(1/$ratio);
	}
	$size = getimagesize($path.$file);
	if ( $size)
	{
		if ($size['mime']=='image/jpeg' )
		{
			$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagejpeg($img_mini,$path."mini_".$file );
		}
		elseif ($size['mime']=='image/png' )
		{
			$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagepng($img_mini,$path."mini_".$file );
		}
		elseif ($size['mime']=='image/gif' )
		{
			$img_big = imagecreatefromgif($path.$file);
			$img_new = imagecreate($x, $y);
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagegif($img_mini,$path."mini_".$file );
		}
	}
	unlink($path.$file);
}
?>
morgan24- 19 mai 2009 à 16:31
Merci pour ton info, mais ça ne fonctionne pas

je viens d'essayer comme ceci :

<?php resize_clone("jackson/", "test.png"); ?>
<?php
function resize_clone($path, $file)
{
list($width, $height, $type, $attr) = getimagesize($path.$file);
$ratio = $height / $width;
if ($height > 500 OR $width > 500)
{
if($ratio <= 1)
{
$x = 500;
$y = 500*$ratio;
}
else
{
$y = 500;
$x = 500*(1/$ratio);
}
}
else
{
if($ratio <= 1)
{
$x = $width;
$y = $width*$ratio;
}
else
{
$y = $height;
$x = $height*(1/$ratio);
}
}
$size = getimagesize($path.$file);
if ( $size)
{
if ($size['mime']=='image/jpeg' )
{
$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagejpeg($img_mini,$path."big_".$file );
}
elseif ($size['mime']=='image/png' )
{
$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagepng($img_mini,$path."big_".$file );
}
elseif ($size['mime']=='image/gif' )
{
$img_big = imagecreatefromgif($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagegif($img_mini,$path."big_".$file );
}
}
if($ratio <= 1)
{
$x = 90;
$y = 90*$ratio;
}
else
{
$y = 90;
$x = 90*(1/$ratio);
}
$size = getimagesize($path.$file);
if ( $size)
{
if ($size['mime']=='image/jpeg' )
{
$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagejpeg($img_mini,$path."mini_".$file );
}
elseif ($size['mime']=='image/png' )
{
$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagepng($img_mini,$path."mini_".$file );
}
elseif ($size['mime']=='image/gif' )
{
$img_big = imagecreatefromgif($path.$file);
$img_new = imagecreate($x, $y);
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagegif($img_mini,$path."mini_".$file );
}
}
unlink($path.$file);
}
?>

et ça me dit :

Warning: unlink(jacksoni/test.png) [function.unlink]: Permission denied in d:\www\jacksonman.fr\htdocs\fototest.php on line 116
jean.miche- 9 févr. 2010 à 21:44
bonjour,

peux-tu me dire comment tu as utilisé cette fonction s'il te plaît ?
Car je n'arrive pas à l'appliquer...
Notamment cette partie :
<?php resize_clone("jackson/", "test.png"); ?> 

Merci :)
jean.miche- 4 févr. 2010 à 19:16
Bonjour et merci pour ce script,

j'ai cependant des questions :
où places-tu la première ligne ?
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>


dois-je remplacer "/ton/chemin/vers/ton/", "image.png" par le dossier vers lequel j'upload mes images ?
c'est à dire "mon_site/dossier_upload/", ce qui supprime la ","


Enfin, il semble y avoir un problème avec le getimagesize puisque lorsque j'ouvre ma page, j'ai :
Warning: Missing argument 2 for resize_clone() in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: Division by zero in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: unlink(../photos/) [function.unlink]: Is a directory in /home/www/...


Merci d'avance. =)
Ajouter un commentaire
Réponse
+1
moins plus
Bonjour,

Je vois que vous avez opté pour le upload avec réduction de l'image en temps réel.
C'est votre choix j'espère que vous avez fait le bon.

Pour augmenter la durée d'un script sur un serveur web il faut modifier la directive max_execution_time du php.ini comme cela n'est pas possible puisque le fichier est chez votre hébergeur alors voici une solution à condition que la directive desable_functions ne soit pas alimenté.

Vous placer cette fonction php dans votre scritp upload : set_time_limit(0);

J'oubliai, il faut aussi que la directive upload_max_filesize soit au dessus de 2Mo

Astuce : placer un fichier php.ini à la racine de votre serveur web avec à l'intérieur

max_execution_time = 180
upload_max_filesize = 10


Cordialement
Ajouter un commentaire
Réponse
+0
moins plus
Permission denied ==> tu n'as pas les droits sur l'image pour la supprimé.
plusieurs possibilité, de la plus propre à la plus burine:

1] si tu as un access ftp, ssh ou même local au serveur, tente un chmod 777 sur ton image
2] sinon essaye de faire un chmod 777 de ton image via php
3] met un @ devant la commande unlink de la fonction
4] supprime la commande unlink de la fonction
morgan24- 20 mai 2009 à 11:13
Bonjour,

Merci beaucoup pour ton aide car ça fonctionne. Il reste qd même un problème..., lorsque le membre upload une photo lourde (style 3 MO) sur mon site, ça ram beaucoup, voir ça plante. Est ce possible de réduire automatiquement la photo juste avant l'upload ? Tout en sachant que le membre ne va pas du tout savoir réduire lui même la photo et ne va pas vouloir s'embêter avec ça.
Il y a un site de vente aux enchères"très connu :-)", ou tu peux insérer des photos ultra lourdes sans attendre 20 ans et sans plantage; comment font ils !?

Merci encore pour votre aide
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Tout d'abord merci beaucoup pour vos infos précieuses, tout fonctionne à merveille, le bonheur total ....

Un dernier petit problème, la qualité de la petite photo n'est pas du tout net, elle fait +/- 3 ko. Comment puis je faire pour qu'elle soit beaucoup plus net (exemple : "dans le site de vente aux enchères" les petites photos de 3 ko sont très net) !

Merci
Ajouter un commentaire
Réponse
+0
moins plus
Alors, j'ai une petite astice, mais je ne sais pas ce que ça pourra donner.
Si je dis pas de bétise ça à marché pour moi:

dans mon script, remplace tout les "imagecreate" par "imagecreatetruecolor", sauf pour les lignes ou il y a:
$img_mini = imagecreatetruecolor($x, $y) or   $img_mini = imagecreate($x, $y);
dans ce cas il te suffis de supprimer "or $img_mini = imagecreate($x, $y)"

Autre chose:

Je vois que vous avez opté pour le upload avec réduction de l'image en temps réel.
C'est votre choix j'espère que vous avez fait le bon.

Ceci m'intéresse:
Que conseillerai tu d'autre que cet astuce ?
Un système qui, par exemple, upload l'image, mais ne la redimensionnerai que, par exemple, aux heurs de creux, ou un script qui "scan" l'activiter de processeur quelques chose comme ça ?
Enfin si tu as d'autre conseil je suis preneur par-ce que c'est vrai que sur un site très visité ça pourrait posé problème.

Merci :)
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour et merci pour ce script,

j'ai cependant des questions :
où places-tu la première ligne ?
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>


dois-je remplacer "/ton/chemin/vers/ton/", "image.png" par le dossier vers lequel j'upload mes images ?
c'est à dire "mon_site/dossier_upload/", ce qui supprime la ","


Enfin, il semble y avoir un problème avec le getimagesize puisque lorsque j'ouvre ma page, j'ai :
Warning: Missing argument 2 for resize_clone() in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: Division by zero in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: unlink(../photos/) [function.unlink]: Is a directory in /home/www/...


Merci d'avance. =)
MoKaLux - 2 nov. 2010 à 02:21
Merci beaucoup pour la fonction, cela marche très bien.
Pour jean.miche tu place
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>
où tu veux, ta page web ou dans ton code même.

Et en ce qui concerne la virgule, non ne la supprime pas car cela sert à envoyer deux données à la fonction resize_clone(01tonchemin, 02tonfichier).
Ajouter un commentaire
Ce document intitulé « Redimensionner une image lors d'un upload » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?