Page 1 sur 2

Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 10:44
par Pauloscorps
Bonjour à tous,

J'ai un petit problème avec mon code qui permet de redimensionner des images uploadées grâce à un <input type="file">.
L'upload fonctionne très bien mais la fonction qui permet de redimensionner (trouvée ici : http://www.phpsources.org/scripts437-PHP.htm) n'a pas l'air encore complètement adaptée. Après plusieurs modifications vaines, j'ai toujours les messages d'erreur suivants :

Code : Tout sélectionner

Warning: getimagesize(photo20110422083219.jpg) [function.getimagesize]: failed to open stream: No such file or directory in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 41 Warning: Division by zero in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 48
Or, c'est la première fois que j'utilise une fonction en PHP, et je ne vois donc pas comment résoudre ces erreurs.

Voici mon code :
<?php
	require_once('../includes/connexion.php');
	session_start();
	if (!isset($_SESSION['login']))
	{
		exit();
	}
	include('../includes/header.php');

if (isset($_POST['submit']))
{
	$idCat = $_POST["idCat"];
	$titreArticle = htmlspecialchars($_POST["titreArticle"]);
	$contenuArticle = htmlspecialchars($_POST["contenuArticle"]);
	$photoArticle = $_FILES["photoArticle"];
	$descPhoto = htmlspecialchars($_POST["descPhoto"]);
	addslashes($contenuArticle) && addslashes($titreArticle) && addslashes($descPhoto);

	if(!empty($idCat) && !empty($titreArticle) && !empty($contenuArticle) && !empty($photoArticle) && !empty($descPhoto))
	{
	//----------------------------------------------------------------------------------------------------------------
	// TRAITEMENT DE L'IMAGE
	//----------------------------------------------------------------------------------------------------------------
		$nomOrigine = $_FILES['photoArticle']['name'];
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
		$repertoireDestination = "../../photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;
		$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);

function Resize_picture($fichier,$chemin,$maxWidth,$maxHeight)
{
	# Passage des paramètres dans la table : imageinfo
	$imageinfo= getimagesize("$fichier");
	$iw=$imageinfo[0];
	$ih=$imageinfo[1];
	# Paramètres : Largeur et Hauteur souhaitées $maxWidth, $maxHeight
	# Calcul des rapports de Largeur et de Hauteur
	$widthscale = $iw/$maxWidth;
	$heightscale = $ih/$maxHeight;
	$rapport = $ih/$widthscale;
	# Calul des rapports Largeur et Hauteur à afficher
	if($rapport < $maxHeight)
	{
		$nwidth = $maxWidth;
	}
		else
		{
			$nwidth = $iw/$heightscale;
		}
		if($rapport < $maxHeight)
		{
			$nheight = $rapport;
		}
		else
		{
			$nheight = $maxHeight;
	}

}
		Resize_picture("$nomDestination","$repertoireDestination",400,270);
	
		if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
		{
		//	echo "Le fichier temporaire ".$_FILES['photoArticle']["tmp_name"].
		//	        " a été déplacé vers ".$URLPhoto;
		}
		else
		{
			echo "Le fichier n\'a pas été uploadé ou ".
			        "Le déplacement du fichier temporaire a échoué".
			        " vérifiez l\'existence du répertoire ".$repertoireDestination;
		}
		}

//------------------------------------------------------------------------------
// REQUETE SQL D'AJOUT DANS LA BDD
//------------------------------------------------------------------------------
		$req = 'INSERT INTO articles (idArticle, idCat, titreArticle, contenuArticle, photoArticle, descPhoto) VALUES ("", "'. $idCat .'", "'. 	$titreArticle .'" , "'. $contenuArticle .'","'. $URLPhoto .'", "'. $descPhoto .'");';
		$result = mysql_query($req, $connexion) or die(mysql_error());

		if ($result)
		{
			echo '<div class="valide"><p>L\'ajout a été correctement effectué.</p></div>' ;
		}
		else
		{
			echo '<div class="echec"><p> L\'ajout a échoué.</p></div>';
		}
	}
	else echo '<div class="echec"><p> Vous n\'avez pas rempli tous les champs. </p></div>';
}
include('../includes/form_ajoutarticle.php');
include('../includes/footer.php');
mysql_close($connexion);

?>
Merci par avance à ceux qui se pencheront sur le problème.
Pauline.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 11:16
par Mazarini
Bonjour,

Vérifie $imageinfo= getimagesize("$fichier");
A priori, $fichier n'existe pas, il faut peut être ajouter le chemin devant.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 11:20
par Pauloscorps
Merci de ta réponse,

En fait, j'imaginais que comme $fichier est dans les paramètres de la fonction, il ne fallait pas le modifier, puisque finalement il est appelé dans les paramètres de la fonction.
Par ailleurs, j'ai déjà essayé tout à l'heure et j'ai toujours le même message d'erreur.

J'ai déjà commencé par déplacer l'appel de la fonction dans le if du déplacement de l'image, cela me parait plus logique comme ca:
		
if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
		{
			Resize_picture("$nomDestination","$repertoireDestination",400,270); // appel de la fonction de redimensionnement
		}

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 11:39
par Mazarini
Bonjour,

Essayes Resize_picture($repertoireDestination.$nomDestination,$repertoireDestination,400,270);
Par contre, je ne voie pas ou est fait le resize de ton image. Je voie juste un calcul de hauteur et de largeur.

Pour l'organisation de ton code, ne mélange pas les fonctions avec le code. Il faut les mettre en début, en fin ou dans un autre fichier. Mettre une fonction en plein milieu est vraiment moche.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 11:48
par Pauloscorps
Merci de ta réponse.
Donc avec ton petit bout de code, je n'ai plus de messages d'erreur, mais la redimension n'a pas fonctionné pour autant.
Voici le code actuel :
<?php
	require_once('../includes/connexion.php');
	session_start();
	if (!isset($_SESSION['login']))
	{
		exit();
	}
	include('../includes/header.php');

	
//------------------------------------------------------------------------------
// FONCTION DE REDIMENSSIONNEMENT DES IMAGES
//------------------------------------------------------------------------------

function Resize_picture($fichier,$chemin,$maxWidth,$maxHeight)
{
	# Passage des paramètres dans la table : imageinfo
	$imageinfo= getimagesize($fichier);
	$iw=$imageinfo[0]; //récupère la largeur de l'image
	$ih=$imageinfo[1]; // récupère la hauteur de l'image
	# Paramètres : Largeur et Hauteur souhaitées $maxWidth, $maxHeight
	# Calcul des rapports de Largeur et de Hauteur
	$widthscale = $iw/$maxWidth;
	$heightscale = $ih/$maxHeight;
	$rapport = $ih/$widthscale;
	# Calul des rapports Largeur et Hauteur à afficher
	if($rapport < $maxHeight)
	{
		$nwidth = $maxWidth;
	}
	else
	{
		$nwidth = $iw/$heightscale;
	}
	if($rapport < $maxHeight)
	{
		$nheight = $rapport;
	}
	else
	{
		$nheight = $maxHeight;
	}

}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

if (isset($_POST['submit']))
{
	$idCat = $_POST["idCat"];
	$titreArticle = htmlspecialchars($_POST["titreArticle"]);
	$contenuArticle = htmlspecialchars($_POST["contenuArticle"]);
	$photoArticle = $_FILES["photoArticle"];
	$descPhoto = htmlspecialchars($_POST["descPhoto"]);
	addslashes($contenuArticle) && addslashes($titreArticle) && addslashes($descPhoto);

	if(!empty($idCat) && !empty($titreArticle) && !empty($contenuArticle) && !empty($photoArticle) && !empty($descPhoto))
	{
	//----------------------------------------------------------------------------------------------------------------
	// TRAITEMENT DE L'IMAGE
	//----------------------------------------------------------------------------------------------------------------
		$nomOrigine = $_FILES['photoArticle']['name'];
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
		$repertoireDestination = "../../photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;
		$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
		
		if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
		{
			Resize_picture($repertoireDestination.$nomDestination,$repertoireDestination,400,270);
		}
		else
		{
			echo "Le fichier n\'a pas été uploadé ou ".
			        "Le déplacement du fichier temporaire a échoué".
			        " vérifiez l\'existence du répertoire ".$repertoireDestination;
		}
		}

//------------------------------------------------------------------------------
// REQUETE SQL D'AJOUT DANS LA BDD
//------------------------------------------------------------------------------
		$req = 'INSERT INTO articles (idArticle, idCat, titreArticle, contenuArticle, photoArticle, descPhoto) VALUES ("", "'. $idCat .'", "'. 	$titreArticle .'" , "'. $contenuArticle .'","'. $URLPhoto .'", "'. $descPhoto .'");';
		$result = mysql_query($req, $connexion) or die(mysql_error());

		if ($result)
		{
			echo '<div class="valide"><p>L\'ajout a été correctement effectué.</p></div>' ;
		}
		else
		{
			echo '<div class="echec"><p> L\'ajout a échoué.</p></div>';
		}
	}
	else echo '<div class="echec"><p> Vous n\'avez pas rempli tous les champs. </p></div>';
}
include('../includes/form_ajoutarticle.php');
include('../includes/footer.php');
mysql_close($connexion);

?>
EDIT : Cette fonction est censée garder le caractère propotionnel de l'image. Or, j'ai besoin d'images qui font toutes 270px de haut. Par conséquent, quelle valeur dois-je entrer pour la largeur dans l'appel de la fonction ? Est-ce que si je mets beaucoup plus que la hauteur (comme je l'ai fais) cela fonctionnera ? Parce que de toute facon, toutes les images seront au format portrait, la hauteur sera toujours supérieure à la largeur ?

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 12:00
par Ryle
Peut être parce que ta fonction ne fait rien de plus que calculer le rapport hauteur/largeur à utiliser sans jamais retourner celui-ci ni mettre à jour de valeur externe à la fonction ? :)

Les fonctions travaillent en autarcie, ce qui se passe dans la fonction reste dans la fonction (c'est la règle numéro du fight club des fonctions ;)). Pour communiquer avec une fonction, il faut lui donner les valeurs dont elle a besoin en paramètre et lui demander éventuellement de te retourner un résultat.

Une autre solution (mais à manipuler avec précaution), consiste à utiliser l'instruction global qui permet de dire que la variable avec laquelle elle travaille est en fait une variable extérieure à la fonction, et que c'est donc cette dernière qu'il faut utiliser et/ou mettre à jour :
$a = 2;
fonction triple($variable) { // prend une variable en paramètre
  return 3 * $variable; // retourne un résultat
}
$resultat = triple($a); // appel à la fonction et récupération du résultat 

echo $a; // affiche 2
echo $resultat; // affiche 6

// Autre solution :

$a = 2;
fonction triple() {
  global $a; // indique que $a est une variable externe à la fonction
  $a = 3 * $a; // met à jour la variable à l'extérieure de la fonction; pas besoin de retourner de résultat
}
triple(); // appel à la fonction, pas besoin de récuperer de résultat

echo $a; // affiche 6

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 12:05
par Pauloscorps
Hum, alors là désolé de te recevoir, merci hein, mais j'ai rien capté ! (ou presque)
Concrètement je dois faire quoi pour que ca marche ? Ajouter mes paramètres directement dans la fonction ?

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 12:18
par Ryle
Concrètement je dois faire quoi pour que ca marche ? Ajouter mes paramètres directement dans la fonction ?
Ben ça dépend... (oui, je sais, ça dépasse :))

Tu attends quoi de ta fonction Resize_picture() ? qu'elle modifie le fichier uplaodé ? qu'elle te retourne les dimensions de l'image ? .. car actuellement, ta fonction ne fait rien de plus que calculer les nouvelles dimensions.. il faut donc voir ce que tu veux faire de ces dimensions ensuite :)

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 13:15
par Pauloscorps
Très drole :D

J'attends de cette fonction qu'elle modifie la taille de mon fichier (une fois qu'il a été déplacé dans le bon dossier, d'où sa présence dans ma boucle if), afin que mes images mesurent toujours 270px de hauteur. Je veux donc que les dimensions calculées par la fonction s'appliquent sur mon image uploadée.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 13:36
par Mazarini
bonjour,

Une recherche dans la doc m'a fait découvrir la fonction imagecopyresized (http://www.php.net/manual/fr/function.i ... esized.php). Ca devrait te permettre de faire ce que tu veux.

getimagesize te donne le type d'image et sa taille
imagecreatefrom???? lit ton image (???? en fonction du type - imagecreatefromgif...)
imagecreate crée une image vide
imagecopyresized permet le changement de taille
image???? crée le fichier image (???? en fonction du type- imagepng...)

Tu as tout les éléments pour résoudre ton problème.

Posté : 22 avr. 2011, 13:49
par Pauloscorps
Je prend bien note de toutes les fonctions que tu viens de me fournir, mais je suis loin de m'y connaitre suffisamment en fonctions PHP pour créer une telle fonction.
De plus, le code que j'ai pris sur le site est semble t-il fonctionnel, donc j'aimerais plutôt essayé de l'adapter à mon cas plutôt que de refaire quelque chose de nouveau (sur lequel je vais passer des heures et qui ne va jamais marcher :mrgreen: ). Enfin, je vous rappelle que copie/déplacement ont déjà été fait.

En gros, il faudrait que je puisse adapter mon code de la façon suivante :
Soit l'image monImage, sa largeur W, sa hauteur H
Donc monImage(W,H) admettons

monImage(W)=maxWidth;
monImage(H)=270;

Très grossièrement. Maintenant, reste à trouver comment rédiger cela.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 14:07
par Mazarini
A toi de voir ce qui sera le plus rapide :
- trouver un script tout fait
- trouver une âme charitable pour faire le script
- écrire le script

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 14:12
par Pauloscorps
:mrgreen: Bien résumé.
En ce qui concerne les scripts, c'est le meilleur (du moins le plus simple et a peu près compréhensible que j'ai trouvé),
Les âmes charitables ça se trouve pas dans ce monde de brutes,
Et moi même, j'y arriverais pas.

Cool.

Re: Erreur sur script de redimensionnement d'image

Posté : 22 avr. 2011, 16:23
par AB
Il y a une classe d'upload et redimensionnement toute faite ici

Re: Erreur sur script de redimensionnement d'image

Posté : 03 mai 2011, 09:28
par Pauloscorps
Bonjour à tous,

Je me permet de remonter ce post quelques semaines après car mon problème n'est toujours pas résolu, et cela commence à être urgent.
Je m'excuse par avance aux auteurs des différents scripts de mon fichier, j'ai fais tellement de copier-coller que je ne sais plus d'où tout ca vient.

Voici mon code :
<?php
	require_once('../includes/connexion.php');
	session_start();
	if (!isset($_SESSION['login']))
	{
		exit();
	}
	include('../includes/header.php');
	
/******************************************************************************/
/*********************** Fonction de redimensionnement ************************/
/******************************************************************************/
function redimage($img_src,$dst_w,$dst_h)
{
	// Lit les dimensions de l'image
	$size = GetImageSize($img_src);
	$src_w = $size[0]; $src_h = $size[1];
	// Teste les dimensions tenant dans la zone
	$test_h = round(($dst_w / $src_w) * $src_h);
	$test_w = round(($dst_h / $src_h) * $src_w);
	// Si Height final non précisé (0)
	if(!$dst_h) $dst_h = $test_h;
	// Sinon si Width final non précisé (0)
	elseif(!$dst_w) $dst_w = $test_w;
	// Sinon teste quel redimensionnement tient dans la zone
	elseif($test_h>$dst_h) $dst_w = $test_w;
	else $dst_h = $test_h;
}
/******************************************************************************/

if (isset($_POST['submit']))
{
	$idCat = $_POST["idCat"];
	$titreArticle = htmlspecialchars($_POST["titreArticle"]);
	$contenuArticle = htmlspecialchars($_POST["contenuArticle"]);
	$photoArticle = $_FILES["photoArticle"];
	$descPhoto = htmlspecialchars($_POST["descPhoto"]);
	addslashes($contenuArticle) && addslashes($titreArticle) && addslashes($descPhoto);

	if(!empty($idCat) && !empty($titreArticle) && !empty($contenuArticle) && !empty($photoArticle) && !empty($descPhoto))
	{
	//----------------------------------------------------------------------------------------------------------------
	// TRAITEMENT DE L'IMAGE
	//----------------------------------------------------------------------------------------------------------------
		$nomOrigine = $_FILES['photoArticle']['name'];
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
	
		$URLPhoto = redimage("$_FILES['photoArticle']",XX,270)
		$repertoireDestination = "../../photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;
		$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
		}
/******************************* Redimimage ***********************************/
		
/*******************************************************************************/

		if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
		{
			//echo "Ca marche !";
		}
		else
		{
			echo "Le fichier n\'a pas été uploadé ou ".
			        "Le déplacement du fichier temporaire a échoué".
			        " vérifiez l\'existence du répertoire ".$repertoireDestination;
		}

//------------------------------------------------------------------------------
// REQUETE SQL D'AJOUT DANS LA BDD
//------------------------------------------------------------------------------
		$req = 'INSERT INTO articles (idArticle, idCat, titreArticle, contenuArticle, photoArticle, descPhoto) VALUES ("", "'. $idCat .'", "'. 	$titreArticle .'" , "'. $contenuArticle .'","'. $URLPhoto .'", "'. $descPhoto .'");';
		$result = mysql_query($req, $connexion) or die(mysql_error());

		if ($result)
		{
			echo '<div class="valide"><p>L\'ajout a été correctement effectué.</p></div>' ;
		}
		else
		{
			echo '<div class="echec"><p> L\'ajout a échoué.</p></div>';
		}
	}
	else echo '<div class="echec"><p> Vous n\'avez pas rempli tous les champs. </p></div>';
}
include('../includes/form_ajoutarticle.php');
include('../includes/footer.php');
mysql_close($connexion);

?>
Outre l'erreur que j'obtiens

Code : Tout sélectionner

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 52
J'ai l'impression que mon script ne va pas marcher.
Je suis complètement désespérée avec ce script de redimensionnement, blasée aussi, qu'un langage aussi commun soit aussi peu aisé à mettre en oeuvre pour une tel chose, je dois bien le dire, courante. Enfin bref.

Si quelqu'un à une idée quelconque pour améliorer mon script, je suis preneuse.
Merci d'avance.