Page 1 sur 2

Upload d'image

Posté : 28 déc. 2005, 22:26
par spirou
Bonsoir !!

J'ai suivi le tutoriel du site sur l'upload de fichier, mais ça ne fonctionne pas :(

J'ai encore dû faire un truc de travers.
Il n'y a aucun message d'erreur affiché, même lorsque j'essaie de mettre une image supérieur en poids à celui autorisé.

Si quelqu'un pouvait jeter un coup d'oeil à mon code, merci :mrgreen:
<form action="astuces.php?astuce=edition" method="post" enctype="multipart/form-data">
								<input type="hidden" name="MAX_FILE_SIZE" value="80000" />
								<p>
									<label>Veuillez entrez votre pseudo</label>
									<input type="text" name="pseudo" maxlength="12" />
								</p>
								<p>
									<label>Entrez le titre de votre astuce</label>
									<input type="text" name="titre" maxlength="50" />
								</p>
								<p>
									<label>Mettre une image</label>
									<input type="file" name="image" />
								</p>
								<textarea name="desc"></textarea>
								
								<input type="submit" value="apercu" />
						</form>
									
						<?php
				}
				if(isset($_POST['pseudo']) && isset($_POST['titre']) && isset($_POST['desc']))
				{
						if(!empty($_POST['pseudo']) && !empty($_POST['titre']) && !empty($_POST['desc']))
						{
								$pseudo = htmlentities($_POST['pseudo']);
								$titre = htmlentities($_POST['titre']);
								$astuce = nl2br(htmlentities($_POST['desc']));
								if(isset($_FILES['image']))
								{
										unset($erreur);
										$extension_tolere = array('png', 'jpg', 'jpeg');		// extension d'images autorisées
										$poids_max = 80000;
										$dossier_upload = "../images/upload";
										if( !in_array( substr(strrchr($_FILES['image']['name'], '.'), 1), $extension_tolere ) )		// si l'extension n'est pas de type $extension_tolere
										{
										$erreur = 'Votre image doit-être de type png, jpeg ou jpg.';
										}
										elseif( file_exists($_FILES['image']['tmp_name'])		// si le fichier existe 
										&& filesize($_FILES['image']['tmp_name']) > $poids_max)	 // et si son poids est supérieur à poids_max
										{
										$erreur = 'Votre image doit être inférieure à 80Ko !';
										}
										if(!isset($erreur))		// s'il n'y pas d'erreur 
										{
										$dest_img = basename($_FILES['image']['name']);		// name signifie le nom de l'image sur la machine du visiteur
										$dest_img = strtr($dest_img,
										'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
										'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');		// remplace les caractères spéciaux
										$dest_img = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_img);		// remplace les autres caractères spéciaux
										move_uploaded_file($_FILES['image']['tmp_name'], $dossier_upload . $dest_img);		// tmp_name chemin temporaire du fichier
										}
								}
								if(isset($erreur))
								{
										echo '<p>', $erreur ,'</p>';
								}
						}
				}
		}
Ensuite, j'aurais une question, j'ai déjà vu des sites qui propose plusieurs enregistrement d'images avec le même input, les fichiers s'affichent en dessous au fur et à mesure, comment fait-on cela ?

Ah oui, aussi, questin qui va vous sembler bête, pourquoi utiliser la fonction unset en début de formulaire ?

Merci.

Posté : 28 déc. 2005, 22:30
par alexbad
Fais un var_dump sur la variable $_FILES et affiche le résultat.

Pour le unset(), je crois que c'est simplement pour s'assurer que la variable est à zéro, simple protection.

Posté : 28 déc. 2005, 22:40
par spirou
Merci.

Voilà ce que ça donne :
array(5) { ["name"]=>  string(10) "france.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(38) "C:/Logiciels/EasyPHP1-8\tmp\php5EE.tmp" ["error"]=>  int(0) ["size"]=>  int(34699) }
Mais je ne sais pas trop comment l'analyser.

Posté : 28 déc. 2005, 23:03
par spirou
Je viens de trouver, j'avais fais une erreur dans le chemin de mon répertoire, j'avais omis de mettre un slash à la fin :oops: désolé.

Par contre si quelqu'un sait comment on le fait pour plusieur fichiers sans mettre plusieurs input, ça m'interresse :D

Merci alexbad :wink:

Posté : 28 déc. 2005, 23:16
par alexbad
Personnellement, j'ai jamais vu ça. Si on prend par exemple le webftp de lycos ou tout autre système d'upload sur le web, on voit bien qu'ils utilisent plusieurs upload... tu peux dire où tu as vu ça?

Posté : 28 déc. 2005, 23:32
par spirou
Bah en fait, je ne sais plus sur quel site j'avais vu ça, mais ça existe, j'en suis sûr, les fichiers s'affichent sous forme de liens en dessous de l'input au fur et à mesure, c'est peut-être fait avec du javascript.

Si je retrouve un lien, je le montrerais.

Posté : 29 déc. 2005, 00:07
par fab
ça doit etre du javascript qui rajoute un input a chaque fois qu'un fichier est envoyé sinon je vois pas sauf peut etre avec activeX mais là merci pour la compatibilité

Posté : 29 déc. 2005, 23:05
par spirou
Bonsoir,

J'ai encore un petit problème avec mon code, même lorsque je n'upload pas d'image quand j'envoi le formulaire, il m'affiche tout de même un message d'erreur :

Votre image doit-être de type png, jpeg ou jpg.

J'arrive pas à trouver pourquoi.

Je remet le code, mais c'est le même :
if(isset($_FILES['image']))
{
		unset($erreur);
		$extension_tolere = array('png', 'jpg', 'jpeg');		// extension d'images autorisées
		$poids_max = 80000;
		$dossier_upload = "../images/upload/";
		if( !in_array( substr(strrchr($_FILES['image']['name'], '.'), 1), $extension_tolere ) )		// si l'extension n'est pas de type $extension_tolere
		{
				$erreur = 'Votre image doit-être de type png, jpeg ou jpg.';
		}
		elseif( file_exists($_FILES['image']['tmp_name'])		// si le fichier existe 
		&& filesize($_FILES['image']['tmp_name']) > $poids_max)	 // et si son poids est supérieur à poids_max
		{
				$erreur = 'Votre image doit être inférieure à 80Ko !';
		}
		if(!isset($erreur))		// s'il n'y pas d'erreur 
		{
				$dest_img = basename($_FILES['image']['name']);		// name signifie le nom de l'image sur la machine du visiteur
				$dest_img = strtr($dest_img,
				'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
				'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');		// remplace les caractères spéciaux
				$dest_img = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_img);		// remplace les autres caractères spéciaux
				move_uploaded_file($_FILES['image']['tmp_name'], $dossier_upload . $dest_img);		// tmp_name chemin temporaire du fichier
				$chemin = $dossier_upload . $dest_img;
		}
		if(isset($erreur))
		{
				echo '<p>' . $erreur .'</p>';
		}
}
Avez vous une idée ?

Posté : 29 déc. 2005, 23:07
par jeff
tu a peut etre u probleme de casse

Posté : 29 déc. 2005, 23:15
par spirou
Qu'entends tu par un problème de casse ?

A quel niveau ?

Posté : 29 déc. 2005, 23:18
par jeff
tu a un tableau qui contient les noms d'extentions celles sont toutes en miniscules, donc si tu envoi un fichier avec par exemeple monimage.JPG
il va y avoir un probleme :wink:

Posté : 29 déc. 2005, 23:29
par spirou
Ah oui tiens, j'avais pas pensé à ça, je vais modifier pour transformer tout en miniscule :o
Merci.

Mais en fait, j'ai dû mal m'expliquer, le problème n'est pas quand j'envoi une image et qu'ensuite je valide le formulaire, là je 'ai pas d'erreur.

C'est quand je valide mon formulaire, mais justement sans envoyer d'image, c'est là qu'il m'affiche ce message d'erreur, et je ne comprends pas puisque le code est dans une condition avec un isset.

Posté : 29 déc. 2005, 23:59
par Truc
C'est quand je valide mon formulaire, mais justement sans envoyer d'image, c'est là qu'il m'affiche ce message d'erreur, et je ne comprends pas puisque le code est dans une condition avec un isset.
la variable $_FILES['image'] existe lors de la validation du formulaire meme si elle est vide.

essaie avec un test comme ça:
if(isset($_FILES['image'])  && !empty($_FILES['image']['tmp_name']) )

Posté : 30 déc. 2005, 00:19
par spirou
C'est ça, ça fonctionne parfaitement :langue:

C'est tellement logique, ce que tu m'as fait comprendre que je me demande à quoi je pense des fois :roll:

Encore une fois merci à vous deux jeff et Truc

:wink:

Posté : 07 janv. 2006, 15:36
par spirou
Bonjour !!

J'ai encore un petit problème concernant l'affichage du message d'erreur concernant le poids de l'image.

Pourquoi lorsque je retire le champ :

Code : Tout sélectionner

<input type="hidden" name="MAX_FILE_SIZE" value="50000" />
de mon formulaire, le message s'affiche, par contre si je le laisse, il ne s'affiche plus ?

Est-ce que cet <input> dans le formulaire est vraiment optionnel ?
J'ai un peu recherché sur google, et j'ai vu des avis contraires.

Ensuite, donc en ayant enlevé, ce champ caché de mon formulaire, le message ne s'affiche plus non plus lorsque la taille de l'image est en méga-octets, j'ai essayé sur l'exemple du tuto du site, et pareil, plus d'affichage du message d'erreur, comment fait-on pour l'afficher, même si la taille est exprimée autrement qu'en kilo-octets ?