Redimension avant upload

Mammouth du PHP | 965 Messages

19 oct. 2006, 05:04

Bonjour,

je voudrais avant tout un avis sur la maniere que faire une redimension avant upload de l'image, j'ai un script qui upload les images sans soucis mais je voudrais que celle depassant une certaine taille soit redimensionné.

pour l'instant j'utilise ce script d'upload :
<?php
      require ("connect.php");


      if(isset($_FILES['photo']))

      {
		//parametres
		unset($erreur);
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 500000;
		$dest_dossier = './images-site/';
		$size = getimagesize("".$_FILES['photo']['tmp_name']);
	 	$height = $size[1];
       	$width = $size[0];
       	$taille = 200;

		// On verrifie les extensions
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
	 	  	$erreur = true;
			header("location: addphoto.php?erreur1");
			exit();
		  }
		// On verrifie la taille du fichier
	 	elseif( file_exists($_FILES['photo']['name']) and $_FILES['photo']['size'] > $taille_max)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur2");
	 	  	exit();
		  }
		elseif( file_exists($_FILES['photo']['name']) and $height > $taille && $width > $taille)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur3");
	 	  	exit();
		  }

		// Si ficher = bonne taille & bonne extension
   	  	if(!isset($erreur))
       	  {

			$dest_fichier = basename($_FILES['photo']['name']);
			//formatage nom fichier
			//enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
			// On upload le fichier
       		move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $_FILES['photo']['name']);

			// On remet a jour la base de donnée
			$valide = "UPDATE `images` SET nom = '".$_FILES['photo']['name']."'  WHERE nom = '".$_POST['pseudo']."' ";
			$test = mysql_query($valide) or die("erreur ! ".mysql_error());

			//Redirection sur page precedente
			header("location: addphoto.php");
		 }
      }else{
		header("location: addphoto.php?erreur4");
	  }

?>
mais j'aimerais savoir a quel moment je dois faire la redimension ?

est ce que je dois le faire dans ma boucle pour la verrification et upload ou avant, tout en debut de script ?

Mammouth du PHP | 19672 Messages

19 oct. 2006, 08:22

Deux chose :
- dans les commentaires de ton code, tu as mentionné juste avant d'utiliser move_uploaded_file() "on uploade le fichier" : à ce stade, le fichier est déjà uploadé sur le serveur, mais dans un répertoire temporaire de PHP et cette fonction va le déplacer vers un autre répertoire.
- C'est à ce moment là que tu peux effectuer un traitement pour redimensionner l'image en utilisant par exemple GD pour la ré-échantilloner.
Ce que je fais personnellement, c'est que je déplace le fichier vers un répertoire temporaire créé à cette fin, j'effectue mes transformations et j'enregistre les nouveaux fichiers dans leur répertoires de destination. Selon le cas, je conserve ou non l'original.
Une fois le traitement effectué, je peux enregistrer les informations en base de données, information retournées par mes fonctions de traitement.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 965 Messages

19 oct. 2006, 10:19

Deux chose :
- dans les commentaires de ton code, tu as mentionné juste avant d'utiliser move_uploaded_file() "on uploade le fichier" : à ce stade, le fichier est déjà uploadé sur le serveur, mais dans un répertoire temporaire de PHP et cette fonction va le déplacer vers un autre répertoire.
Ok j'avais oublier cette etape dans l'upload de l'image je modifie le texte :)
- C'est à ce moment là que tu peux effectuer un traitement pour redimensionner l'image en utilisant par exemple GD pour la ré-échantilloner.
Ce que je fais personnellement, c'est que je déplace le fichier vers un répertoire temporaire créé à cette fin, j'effectue mes transformations et j'enregistre les nouveaux fichiers dans leur répertoires de destination. Selon le cas, je conserve ou non l'original.
Une fois le traitement effectué, je peux enregistrer les informations en base de données, information retournées par mes fonctions de traitement.
Donc avant de faire mon move_upload_file() je dois redimensionner l'image on vas dire pour un affichage maximum de 800*600, quel commande je dois utiliser ?

Mammouth du PHP | 19672 Messages

19 oct. 2006, 12:31

Il existe des classes toutes prêtes qui font ça très bien, fouille un peu sur :google: avec par exemple "PHP Class Thumbnail" ou encore va faire un tour sur PHPClasses, ce serait surprenant que tu ne trouves pas ton bonheur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 965 Messages

19 oct. 2006, 17:41

Il existe des classes toutes prêtes qui font ça très bien, fouille un peu sur :google: avec par exemple "PHP Class Thumbnail" ou encore va faire un tour sur PHPClasses, ce serait surprenant que tu ne trouves pas ton bonheur.
Dans le lien que tu donne après quelque recherche je trouve une page qui explique comment redimenssioner l'image : http://phpclasses.goelette.net/browse/file/4571.html

Merci pour le liens et les explications je met la balise [Resolu]

Mammouth du PHP | 965 Messages

21 oct. 2006, 06:00

En fait j'ai de gros soucis avec le script que j'ai pu trouver sur internet pour m'aider, j'arrive bien a tout configurer mais lorsque je me retrouve a vouloir modifier l'image, il ne la trouve pas dans le dossier tmp de wamp (le server HTTP que j'utilise).

Je ne comprends pas ou chercher l'image temporaire pour la modifier mon php.ini m'indique :
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
upload_tmp_dir = "c:/wamp/tmp"
donc je me dis que ce doit être le dossier stocker mais lors de l'envoie on me retorque que :


Warning: getimagesize(.../wamp/tmp/image.jpg.) [function.getimagesize]: failed to open stream: No such file or directory in C:\wamp\www\xxx\xxx.php on line
j'ai le code suivant :
<?php
      require ("connect.php");


      if(isset($_FILES['photo']))

      {
		//parametres
		unset($erreur);
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 400000000;
		$dest_dossier = './images-site/';
		$size = getimagesize("".$_FILES['photo']['tmp_name']);
	 	$height = $size[1];
       	$width = $size[0];
       	$taille = 2000;

       	// On verrifie que le fichier n'est pas déjà existant
       	if ($handle = opendir('images-site')) {

			while (false !== ($file = readdir($handle))) {
    			if($file == $_FILES['photo']){
      				$Fnm = $_FILES['photo'];
			        $voiture = str_replace(' ','%20%',$Fnm);
			        $fichier = "images-site/".$Fnm;
			        header("location: addphoto.php?erreur5");
					exit();
			    }
			}
		}

		// On verrifie les extensions
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
	 	  	$erreur = true;
			header("location: addphoto.php?erreur1");
			exit();
		  }
		// On verrifie la taille du fichier
	 	elseif( file_exists($_FILES['photo']['name']) and $_FILES['photo']['size'] > $taille_max)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur2");
	 	  	exit();
		  }
		elseif( file_exists($_FILES['photo']['name']) and $height > $taille && $width > $taille)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur3");
	 	  	exit();
		  }

		// Si ficher = bonne taille & bonne extension
   	  	if(!isset($erreur))
       	  {

			$dest_fichier = basename($_FILES['photo']['name']);
			//formatage nom fichier
			//enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);

			// On redimensionne l'image
			function resize($image,$sm,$type){
			GLOBAL $image,$sm_largeur,$sm_hauteur;
			$path = ".../wamp/tmp/";

			// obtenir la taille de l'image

			$arr = getimagesize("$path$image.$type");

			// initialisation de la variable largeur

			$largeur=$arr[0];

			// initialisation de la variable hauteur
			$hauteur=$arr[1];


			$facteur=($largeur/$sm);

			// Vérifie si l'image est plus petite que $sm

			if ($largeur < $sm){

			// si vrai retourne les mêmes valeurs d'origine de l'image

			$sm_largeur=$largeur;
			$sm_hauteur=$hauteur;

			// sinon affecte des nouvelles valeurs

			} else {
			$sm_largeur=($largeur/$facteur);
			$sm_hauteur=($hauteur/$facteur);
			}
			}

			$image=$_FILES['photo']['name'];
			$sm=400;
			$type="";

			// appel de la fonction

			resize("$image","$sm","$type");

			// On replace le fichier dans le repertoire final
       		move_uploaded_file($image, $dest_dossier . $_FILES['photo']['name']);

			// On remet a jour la base de donnée
			$valide = "UPDATE `images` SET nom = '".$_FILES['photo']['name']."'  WHERE nom = '".$_POST['pseudo']."' ";
			$test = mysql_query($valide) or die("erreur ! ".mysql_error());

			//Redirection sur page precedente
			header("location: addphoto.php");
		 }
      }else{
		header("location: addphoto.php?erreur4");
	  }

?>
Il faudrait simplement retoucher l'image pour l'avoir a la bonne taille avant l'upload mais je ne sais pas pourquoi il ne me trouve pas mon image dans le dossier temporaire, une idée ? :oops:

Mammouth du PHP | 965 Messages

21 oct. 2006, 06:08

En utilisant :
$_FILES['photo']['tmp_name']
a la place de
$_FILES['photo']['name']
Il me trouve bien le fichier apparement l'update bien mais il n'est pas modifier, je ne comprends pas pourqoi ... :roll:

Invité
Invité n'ayant pas de compte PHPfrance

16 janv. 2007, 11:55

En fait j'ai de gros soucis avec le script que j'ai pu trouver sur internet pour m'aider, j'arrive bien a tout configurer mais lorsque je me retrouve a vouloir modifier l'image, il ne la trouve pas dans le dossier tmp de wamp (le server HTTP que j'utilise).

Je ne comprends pas ou chercher l'image temporaire pour la modifier mon php.ini m'indique :
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
upload_tmp_dir = "c:/wamp/tmp"
donc je me dis que ce doit être le dossier stocker mais lors de l'envoie on me retorque que :


Warning: getimagesize(.../wamp/tmp/image.jpg.) [function.getimagesize]: failed to open stream: No such file or directory in C:\wamp\www\xxx\xxx.php on line
j'ai le code suivant :
<?php
      require ("connect.php");


      if(isset($_FILES['photo']))

      {
		//parametres
		unset($erreur);
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 400000000;
		$dest_dossier = './images-site/';
		$size = getimagesize("".$_FILES['photo']['tmp_name']);
	 	$height = $size[1];
       	$width = $size[0];
       	$taille = 2000;

       	// On verrifie que le fichier n'est pas déjà existant
       	if ($handle = opendir('images-site')) {

			while (false !== ($file = readdir($handle))) {
    			if($file == $_FILES['photo']){
      				$Fnm = $_FILES['photo'];
			        $voiture = str_replace(' ','%20%',$Fnm);
			        $fichier = "images-site/".$Fnm;
			        header("location: addphoto.php?erreur5");
					exit();
			    }
			}
		}

		// On verrifie les extensions
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
	 	  	$erreur = true;
			header("location: addphoto.php?erreur1");
			exit();
		  }
		// On verrifie la taille du fichier
	 	elseif( file_exists($_FILES['photo']['name']) and $_FILES['photo']['size'] > $taille_max)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur2");
	 	  	exit();
		  }
		elseif( file_exists($_FILES['photo']['name']) and $height > $taille && $width > $taille)
	 	  {
	 	  	$erreur = true;
	 	  	header("location: addphoto.php?erreur3");
	 	  	exit();
		  }

		// Si ficher = bonne taille & bonne extension
   	  	if(!isset($erreur))
       	  {

			$dest_fichier = basename($_FILES['photo']['name']);
			//formatage nom fichier
			//enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);

			// On redimensionne l'image
			function resize($image,$sm,$type){
			GLOBAL $image,$sm_largeur,$sm_hauteur;
			$path = ".../wamp/tmp/";

			// obtenir la taille de l'image

			$arr = getimagesize("$path$image.$type");

			// initialisation de la variable largeur

			$largeur=$arr[0];

			// initialisation de la variable hauteur
			$hauteur=$arr[1];


			$facteur=($largeur/$sm);

			// Vérifie si l'image est plus petite que $sm

			if ($largeur < $sm){

			// si vrai retourne les mêmes valeurs d'origine de l'image

			$sm_largeur=$largeur;
			$sm_hauteur=$hauteur;

			// sinon affecte des nouvelles valeurs

			} else {
			$sm_largeur=($largeur/$facteur);
			$sm_hauteur=($hauteur/$facteur);
			}
			}

			$image=$_FILES['photo']['name'];
			$sm=400;
			$type="";

			// appel de la fonction

			resize("$image","$sm","$type");

			// On replace le fichier dans le repertoire final
       		move_uploaded_file($image, $dest_dossier . $_FILES['photo']['name']);

			// On remet a jour la base de donnée
			$valide = "UPDATE `images` SET nom = '".$_FILES['photo']['name']."'  WHERE nom = '".$_POST['pseudo']."' ";
			$test = mysql_query($valide) or die("erreur ! ".mysql_error());

			//Redirection sur page precedente
			header("location: addphoto.php");
		 }
      }else{
		header("location: addphoto.php?erreur4");
	  }

?>
Il faudrait simplement retoucher l'image pour l'avoir a la bonne taille avant l'upload mais je ne sais pas pourquoi il ne me trouve pas mon image dans le dossier temporaire, une idée ? :oops:

ViPHP
ViPHP | 2144 Messages

16 janv. 2007, 15:24

Je ne vois pas dans ton code que tu redimenssionne réelllement l'image. Tu fais bien des calculs pour trouver la nouvelle dimension, mais ton code visiblement ne fait rien de plus. Je te conseillerai d'aller jeter un coud d'oeil à la documentation qui concerne la librairie gd, qui offre toutes les fonctions nécessaire pour manipuler les images.