[Besoin d'aide] Script upload & redimmensionnement

Eléphant du PHP | 71 Messages

29 oct. 2011, 13:32

Bonjour à tous !

Cela fait quelques jours que j'essaye de venir à bout de ce script... Mais je n'y arrive pas.
J'ai cherché des erreurs, mais je ne les trouve pas.

Voici ce que fais ce script :
1)Il demande à l'utilisateur d'envoyer une image
2)Il vérifie que c'est une image de moins de 1 mo
3)Il accepte l'image en l'enregistrant sous un numéro qui s'incrémente dans un fichier
4)Il fait une miniature de l'image, qui supprime la "grande" image

Voici le script :
<?php 
						include('connexion_bdd.php');
						
						if ($_FILES['envoi'] == true && $_FILES['envoi']['error'] == 0)	//Un fichier est envoyé sans erreur
						{
							if ($_FILES['envoi']['size'] < 1000000) //Si le fichier fait moins de 1 Mo
							{
								$infosfichier = pathinfo($_FILES['envoi']['name']);
								$extension_upload = $infosfichier['extension'];
								$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
								if (in_array($extension_upload, $extensions_autorisees))	//Si le fichier à la bonne extension
								{
									$compteur = fopen('nameimg.cyar', 'r+');
									$ligne = fgets($compteur);
									$ligne++;
									fseek($compteur, 0);
									fputs($compteur, $ligne);
									fclose($compteur);
									mysql_query("INSERT INTO uploads VALUES (' ', '".$_SESSION['id']."', '".$ligne."', '".$infosfichier['extension']."')");
									move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($ligne));
									$nom = $ligne . $infosfichier['extension'];
									include('imgClass.php');
									Img::creerMin('uploads/'.$nom,'uploads/min',$nom,215,112);
									
								}
								
								else	//si le fichier n'a pas la bonne extension
								{
									echo "Délolé, mais le fichier envoyé n'est pas une image reconnue par le serveur";
								}
							}
							
							else //si le fichier fait plus de 1 Mo
							{
								echo "Désolé, mais l'image envoyée est trop grosse.";
							}
						} ?>
Et la fonction creerMin :
<?php

class Img{

	static function creerMin($img,$chemin,$nom,$mlargeur=100,$mhauteur=100){
		
		
		$dimension=getimagesize($img);
		
		if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }
		else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); }
		else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); }
		
		else{return false; }
		
		$miniature =imagecreatetruecolor ($mlargeur,$mhauteur); 
		
		if($dimension[0]>($mlargeur/$mhauteur)*$dimension[1] ){ $dimY=$mhauteur; $dimX=$mhauteur*$dimension[0]/$dimension[1]; $decalX=-($dimX-$mlargeur)/2; $decalY=0;}
		if($dimension[0]<($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mlargeur*$dimension[1]/$dimension[0]; $decalY=-($dimY-$mhauteur)/2; $decalX=0;}
		if($dimension[0]==($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mhauteur; $decalX=0; $decalY=0;}
		
		imagecopyresampled($miniature,$image,$decalX,$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
		
		if(substr(strtolower($img),-4)==".jpg"){imagejpeg($miniature,$chemin."/".$nom.".jpg",90);}
                else if(substr(strtolower($img),-4)==".png"){imagejpeg($miniature,$chemin."/".$nom.".png",90);}
                else if(substr(strtolower($img),-4)==".gif"){imagejpeg($miniature,$chemin."/".$nom.".gif",90);}
		return true;
	}
}

?>
L'erreur affichée est :
Warning: getimagesize(uploads/jpg) [function.getimagesize]: failed to open stream: No such file or directory in www/imgClass.php on line 8
Merci d'avance pour votre aide ! :)

Eléphanteau du PHP | 34 Messages

29 oct. 2011, 13:42

Salut Titiii,

D'après l"erreur, ton fichier contenant la class pour resize les images n'est pas au bonne endroit quand tu fais ton appel
include('imgClass.php');
De plus, il est préférable de placer ton include de fichier au début de ton fichier comme tu as fais pour include('connexion_bdd.php');

Eléphanteau du PHP | 34 Messages

29 oct. 2011, 13:46

Et vérifie aussi que les dossier uploads et min sont bien ciblés existes et dans ce bout de code :
move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($ligne));
$nom = $ligne . $infosfichier['extension'];
include('imgClass.php');
Img::creerMin('uploads/'.$nom,'uploads/min',$nom,215,112);

Eléphant du PHP | 71 Messages

29 oct. 2011, 13:54

Min est un dossier ? Je ne comprends pas :/

Sinon quelqu'un aurait une idée pour remplacer ça ? En fait c'est un gars qui m'a passé le bout de code du redimensionnement... 8-|
J'ai mis l'include du fichier au même endroit que l'include de la connexion à la bdd.
J'ai aussi modifié min par uploads/$nom

(qui va être par exemple : uploads/1.png )

Merci :)

Eléphant du PHP | 71 Messages

29 oct. 2011, 15:40

(Petit Up :mrgreen: )

Eléphanteau du PHP | 34 Messages

29 oct. 2011, 17:40

C'est un problème de destination. Je t'explique.

Donc en imaginant que $nom = 'monImage.jpg'.

le processus se fait ainsi :
Img::creerMin('uploads/monImage.jpg, 'uploads/min', 'monImage', 215, 112)
On envoie le lien de mon image ($img) avec pour nom 'monImage' ($nom), on lui applique des dimensions et on l'envoi dans le dossier des miniatures ($chemin).

Mais le dossier des miniature dans le code actuel a pour lien 'uploads/min/'..... alors que tu fais appel à une image dans le dossier 'uploads'
L'arborescence des fichier doit donc se présenter comme ceci:

Le dossier uploads contient :
-les fichiers images,
-le dossier min qui contient :
-les fichiers image miniaturiser

Petite précision concernant 'min' :
Les lignes de code suivantes te montre que c'est un dossier :
if(substr(strtolower($img),-4)==".jpg"){imagejpeg($miniature,$chemin."/".$nom.".jpg",90);}
else if(substr(strtolower($img),-4)==".png"){imagejpeg($miniature,$chemin."/".$nom.".png",90);}
else if(substr(strtolower($img),-4)==".gif"){imagejpeg($miniature,$chemin."/".$nom.".gif",90);}
return true;
Est-ce que tu as compris le traitement des différentes variables dans les lignes ci-dessus ?

Eléphant du PHP | 71 Messages

29 oct. 2011, 18:16

Alors j'ai modifié cette ligne par :
Img::creerMin('uploads/'.$nom, 'uploads/', $ligne,215,112);
Par exemple : $nom = 1.png
$ligne = 1

Du coup, pour les les images soient remplacées, j'ai supprimé le dossier min, car je n'utiliserait pas les images en taille réelle.

Sinon, non, je ne comprends pas ces quatre lignes de code :s

Eléphanteau du PHP | 34 Messages

29 oct. 2011, 19:32

Ok. Traduction en différé c'est parti,

On a le code suivant :
if(substr(strtolower($img),-4)==".jpg"){imagejpeg($miniature,$chemin."/".$nom.".jpg",90);}
else if(substr(strtolower($img),-4)==".png"){imagejpeg($miniature,$chemin."/".$nom.".png",90);}
else if(substr(strtolower($img),-4)==".gif"){imagejpeg($miniature,$chemin."/".$nom.".gif",90);}
strtolower() => met en minuscule
substr() => avec le paramètre -4 signifie qu'il récupère les 4 derniers caractères de l'image et qui correspondent à l'extension de l'image (.jpg, .png, .gif)

Ensuite il te créé un lien pour l'image avec la fonction imagejpeg()
lien qui ressemble à ça avec l'exemple précédent (donc en concervant le dossier min)(observe bien : un slash est rajouté entre le chemin et le nom)
uploads/min/monImage.jpg

Remarque :
le lien va varier de tel manière selon le résultat retourné par la fonction substr() ( et le paramètre '-4')
uploads/min/monImage.jpg
uploads/min/monImage.png
uploads/min/monImage.gif
Au final il faut admettre que le script n'est pas dynamique car les extensions doivent forcément se limiter à 3 caractères et tu sera obliger de rajouter une ligne de code pour chaques extensions que tu souhaite ajouter.... :?

Donc maintenant si on en vient aux modifications que tu as apporté, le script te retourneras le lien suivant :
$nom = 1.png
$ligne = 1
Img::creerMin('uploads/'.$nom, 'uploads/', $ligne,215,112);
lien ==> uploads//1.png

Modification a apporter :
remplace
Img::creerMin('uploads/'.$nom, 'uploads/', $ligne,215,112);
par
Img::creerMin('uploads/'.$nom, 'uploads', $ligne,215,112);
Tiens moi au courant si tu as des erreurs.

Eléphant du PHP | 71 Messages

29 oct. 2011, 20:59

J'ai toujours la même erreur :s
Warning: getimagesize(uploads/png) [function.getimagesize]: failed to open stream: No such file or directory in /www/imgClass.php on line 8

Eléphant du PHP | 71 Messages

30 oct. 2011, 22:48

(Petit Up :mrgreen: )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 oct. 2011, 13:21

le fichier n'existe pas !

Et quand je vois ton code je pense qu'il n'a pas tort !
<?php
move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($ligne));
//....
Img::creerMin('uploads/'.$nom,....);
?>
Tu copie ton fichier dans 'uploads/' . basename($ligne) et tu utilise 'uploads/'.$nom, la je pense qu'il y a une différence !

un truc qui peux t'aider : http://phpdebutant.org/article52.php

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 71 Messages

31 oct. 2011, 14:41

Merci, j'ai modifié ça... Mais j'ai toujours la même erreur.
(j'ai bien sûr mis la définition de $nom avant ;) )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 oct. 2011, 17:34

utilise var_dump() dans la méthode de redimensionnement pour voir ce que tu lui passe comme info.
idem avant le move_uploaded_file sur le nom que tu met en second paramètre histoire de comparer les deux !

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 71 Messages

02 nov. 2011, 18:04

Bonjour !
J'ai mis comme ceci :
if (in_array($extension_upload, $extensions_autorisees))	//Si le fichier à la bonne extension
								{
									$compteur = fopen('nameimg.cyar', 'r+');
									$ligne = fgets($compteur);
									$ligne++;
									$nom = $ligne . $infosfichier['extension'];
									fseek($compteur, 0);
									fputs($compteur, $ligne);
									fclose($compteur);
									mysql_query("INSERT INTO uploads VALUES (' ', '".$_SESSION['id']."', '".$ligne."', '".$infosfichier['extension']."')");
									var_dump($nom);
									move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . $nom);
									
									
									var_dump($ligne);
									Img::creerMin('uploads/'.$nom, 'uploads', $ligne,215,112);
									
								}
Et voici ce que j'ai :
string(3) "png" bool(false)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 nov. 2011, 18:34

bon déjà le var_dump($ligne) on s'en fou un peu la :)

par contre tu peux voir que le var_dump($nom) t'indique que le nom de fichier pour le déplacement c'est 'upload/png' ce qui, je pense, ne te convient pas :mrgreen:

tu peux remplacer ces lignes
<?php
$ligne = fgets($compteur);
$ligne++;
$nom = $ligne . $infosfichier['extension'];
fseek($compteur, 0);
fputs($compteur, $ligne);
fclose($compteur);
?>
par un file_get_contents un increment et file_put_contents :)

je ne comprend pas ce que tu veux faire avec ce fichier. si c'est pour avoir un nom de fichier unique tu peux utiliser, par exemple uniq_id, ou microtime

@+
Il en faut peu pour être heureux ......