Erreur sur script de redimensionnement d'image

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 : Erreur sur script de redimensionnement d'image

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 06 mai 2011, 16:40

Oh mon Dieu ca y'est çà marche !
Merci de votre aide, et voici la solution (enfin, ma solution, parce que c'est pas forcément la meilleure non plus) :
		$nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = "c:/wamp/tmp/";
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		$repertoireDestination = "c:/wamp/www/smtk/photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;

		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
			if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
			{

				$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$repertoireDestination,$nomDestination);
				if ($redimOK == true)
				{
				//	echo 'Redimensionnement OK !';
				}
				else
				{
					echo 'Le redimensionnement a réussi.';
				}
				$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
				// ca marche !
			}
			else
			{
				echo "Le fichier n'a pas été uploadé ";
			}
		
		//	echo ' <br/> rep_dst=' .$repertoiredestination. ' <br/>nom_dst= ' .$nomDestination. '<br/> rep_src=' .$elementsChemin. '- <br/>nom_src =' .$nomOrigine.'';

		}

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 06 mai 2011, 10:09

Bonjour,

Je reviens vers vous pour vous informer que j'ai essayé une autre fonction qui est celle de J. Reaux (consultable ici : http://j-reaux.developpez.com/tutoriel/ ... mage/#LIII)

Cependant, j'ai un petit problème quant à son adaptation.

Voici l'architecture de la fonction :
function fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
Voici mes variables et l'appel de la fonction, dans mon fichier ajoutarticle.php :
		$nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = $_FILES['photoArticle']['tmp_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;

		}

		$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$elementsChemin,$nomOrigine);
		if ($redimOK == true) { echo 'Redimensionnement OK !'; }
		else { echo 'Essaye encore T_T'; }
		
		$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
Premier essai, j'obtiens mon 'Redimessionnement Ok!', mais l'image n'a pas été redimensionnée.
Ensuite, j'ai touché à quelque chose et j'ai 'Essaye encore'.
Bon, de toute facon ca marchait pas, pas de quoi en faire un plat.

Mais du coup je me demande si j'appelle ma fonction comme il faut. J'ai notamment un petit doute sur le 5eme paramètre "$elementsChemin".
De plus, je viens de m'apercevoir que mon image a bien été redimensionnée (ca ma surpris sur le coup ^^) mais dans mon dossier edition (c'est-à-dire celui qui contient mon fichier ajoutarticle.php). Son nom d'origine était 'astronaute.jpg', il s'appelle maintenant 'Arrayastronaute.jpg'. Il semblerait donc qu'il y ai eu un petit souci.

Si quelqu'un pouvait m'éclairer sur ces différentes questions...
Merci d'avance :mrgreen:


EDIT : Après consultation du manuel, je viens de m'apercevoir que $elementsChemin retourne un tableau, donc forcèment, ma photo s'appelle 'Array machin chose'
Je l'ai donc remplacé par la variable suivante :
	$repertoireOrigine = $_FILES['photoArticle']['tmp_name'];
Pour obtenir :
$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$repertoireOrigine,$nomOrigine);

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 04 mai 2011, 09:32

Merci de ta réponse,

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

/******************************************************************************/
/*********************** Fonction de redimensionnement ************************/
/******************************************************************************/

/******************************************************************************/

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))
			{
				function redimage($img_src,$dst_w,$dst_h)
				{
					// Lit les dimensions de l'image
					$size = GetImageSize($repertoireDestination.$nomDestination);
					$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;
					return;
				}
				redimage($repertoireDestination.$nomDestination,0,270);
			}
			else
			{
				echo "Le fichier n'a pas été uploadé ";
			}
//------------------------------------------------------------------------------
// 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);

?>
J'ai essayé de mettre la fonction directement dans les if pour palier aux problèmes de définition des variables, mais rien à faire, elles ne le sont effectivement pas. J'obtiens 5 messages d'erreur : $repertoireDestination et $nomDestination undefined, getimagesize() qui est vide, et toujours les deux divisions par zéro.
De plus, pourrais-tu m'éclairer sur ce que doit retourner la fonction ? J'ai beau réfléchir, je ne vois pas quelle variable retourner #-o . J'ai pensé aux nouvelles largeurs et hauteurs bien sûr, mais puis-je en mettre deux dans le return ?

Merci d'avance.

Re: Erreur sur script de redimensionnement d'image

par moogli » 03 mai 2011, 22:04

redimage($repertoireDestination.$nomDestination,0, 270);

Ce code est a utiliser dans le if qui valide l'upload (move_uploaded_file) car il te faut modifier l'image qui est validé et non le fichier temporaire.

qui plus est, dans le dernier code, il n'y a pas de return dans la fonction ni même de fonctions de traitement d'image ce qui me fait dire qu'iln'y aura pas de redimensionnement d'image ;)

[quote=Pauloscorps]
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.[/quote]

Je dirais plutôt que, comme tous langage, il faut respecter une logique et correctement utiliser la syntaxe, hors (désolé) ce n'est pas le cas ici.
Le fait que cela soit courant n'inclus pas la simplicité ;)


@+

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 03 mai 2011, 16:18

Wow merci pour toutes ces explications, même si je galère encore.

Ok pour l'appel de la fonction, il suffisait de mettre "0" =P~ .

Pour mettre le bon argument dans getImageSize, j'ai testé plusieurs solutions, mais aucune n'a fonctionné :
	$size = GetImageSize($_FILES['photoArticle']['tmp_name']); //renvoie un chemin qui se termine par un fichier .tmp
	$size = GetImageSize($_FILES['photoArticle']['tmp_name'].$_FILES['photoArticle']['name']); // pareil qu'en haut + nom d'origine du fichier
        $size = GetImageSize($repertoireDestination.$nomDestination); // ne marche pas car ces variables sont définies après la fonction (enfin surement)
       Et quelques autres encore plus loufoques.
Du coup, je pense avoir compris qu'il faut indiquer le chemin de mon fichier temporaire (ce que j'ai essayé de faire) mais je n'y parviens pas.
Enfin, j'imagine que résoudre ce problème, amènera à la résolution des 2 autres ?

Re: Erreur sur script de redimensionnement d'image

par macgawel » 03 mai 2011, 15:21

1. La fonction redimage attend en paramètres : image source, largeur souhaitée, hauteur souhaitée.
Le problème, c'est qu'en PHP on peut définir une constante XX (via la comande define ( XX, <laValeurConstante>)).
Du coup PHP considère que XX est une constante, mais elle n'a pas été définie.
Alors comme il est gentil, il l'interprète comme une chaîne de caractères...
Pour ce qu'il faut mettre, ben il suffit de lire le script :
// Si Height final non précisé (0)
2. La fonction getimagesize() attend comme premier paramètre une chaîne de caractère, mais elle reçoit un array.
Là encore, si tu lis le script, tu as $size = GetImageSize($img_src);
=> $img_src serait un Array.
En remontant, tu vois que $img_src est le premier paramètre passé à redimage.
Et l'appel à la fonction :
redimage("$_FILES['photoArticle']",XX,270)
Si tu lis le manuel (RTFM :evil: ), tu verras que $_FILES est un tableau... Et que GetimageSize attend une chaîne avec le nom (et le chemin) du fichier....
Pour savoir ce qu'il faut prendre comme valeur, tu peux toujours afficher le contenu de $_FILES :
print_r($_FILES);
3 et 4. La division par zéro :
Le problème vient de cette ligne $dst_w / $src_w
=> en remontant on voit que $src_w = $size[0], et que $size = GetImageSize($img_src);
Comme on a vu que GetImageSize ne reçoit pas le bon paramètre, un coup d'oeil dans le manuel nous montre que GetimageSize renvoit FALSE...

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 03 mai 2011, 14:29

Merci de ta réponse.

J'ai effectivement trouvé les erreurs syntaxiques et les ai corriger.
Cependant, jobtiens maintenant un nombre incalculable (4 en fait :mrgreen: ) de Warning et autres Notice.
J'ai bien pris un script déjà existant, je ne l'ai point inventé (j'en suis pas capable ^^). Il me semble que c'était sur asp-php.net.

Les voici :

Code : Tout sélectionner

Notice: Use of undefined constant XX - assumed 'XX' in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 55 Warning: getimagesize() expects parameter 1 to be string, array given in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 16 Warning: Division by zero in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 19 Warning: Division by zero in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 20
Pour ce qui est de la première erreur, je ne sais pas quoi mettre à la place de XX, puisque j'aimerais garder la proportionalité de l'image (en gros, je veux juste spécifier la hauteur de l'image, et la largeur serait en fonction).
La deuxième, je n'ai aucune idée, et les deux autres, j'ai l'impression que cela fait comme si je n'avais pas uploadé d'image #-o (pas de données -> divison par zero non ?).

Merci d'avance.

Re: Erreur sur script de redimensionnement d'image

par macgawel » 03 mai 2011, 11:37

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
Ce genre de message, c'est signe d'une erreur de syntaxe :mrgreen:
Malheureusement, la ligne signalée n'est pas forcément celle sur laquelle se trouve l'erreur...

Les cas les plus courants :
- Quote/guillemet non fermée. Si tu as un éditeur de texte à coloration syntaxique, ça se voit vite...
- Parenthèse / Accolade non fermée. Là encore, un éditeur de texte à coloration syntaxique, ça aide.
- Oubli d'un ; à la fin de la ligne précédente. #-o

Sinon, le script a l'air correct (à vue de nez).
Mais je te conseillerais, surtout pour commencer, de reprendre un script / une fonction / une classe déjà existant, quitte à modifier. Par exemple [url=vos-contributions/upload-fichiers-verif ... 29.htmlICI[/url]...
En plus, tu peux l'étudier, c'est toujours instructif...

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 03 mai 2011, 09:28

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.

Re: Erreur sur script de redimensionnement d'image

par AB » 22 avr. 2011, 16:23

Il y a une classe d'upload et redimensionnement toute faite ici

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 22 avr. 2011, 14:12

: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

par Mazarini » 22 avr. 2011, 14:07

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

par Pauloscorps » 22 avr. 2011, 13:49

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

par Mazarini » 22 avr. 2011, 13:36

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.

Re: Erreur sur script de redimensionnement d'image

par Pauloscorps » 22 avr. 2011, 13:15

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.