Page 1 sur 1

Problème avec l'upload d'image

Posté : 02 juil. 2006, 00:31
par Darklyth
Bonjour,

J'ai un gros problème avec l'upload d'images.

Je voudrais que l'on puisse envoyer un avatar en s'inscrivant sur mon site et que le fichier soit renommer en Pseudo de l'utilisateur.

Après avoir parcouru le web pour essayer d'apprendre, j'en suis arrivé à écrire ces lignes dans le fichier qui traite l'inscription :
if(is_uploaded_file($_FILES['avatar']['tmp_name']))
{
$poids_image_max="50000";
	if($infos_images=getimagesize($_FILES['avatar']['tmp_name']))
	{
		if($_FILES['avatar']['size']>$poids_image_max)
		{
		print "Votre avatar ne doit pas dépasser 50ko !";
		}
		else
		{
		$uploaddir='/avatars/';
		$uploadfile=$uploaddir.basename($_POST['pseudo']);
		move_uploaded_file($_FILES['avatar']['tmp_name'],$uploadfile);			
		$avatar_final=$_POST['pseudo'];
		}
	}
	else
	{
	print "Votre avatar doit être un fichier de type image !";
	}
}
else
{
$avatar_final="avatar_defaut.jpg";
}
Je vous met aussi une partie du code du formulaire :

Code : Tout sélectionner

<form method="POST" action="?p=inscription_suite" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="50000" /> <input type="file" name="avatar" size="19"> </form>

Voilà, alors le problème c'est que toute la partie d'upload d'image est TOTALEMENT ignorée, que j'envoie une image de 150ko ou de moins de 50ko, l'inscription est quand même réussie, de plus l'image n'est pas déplaçée dans le dossier et est donc supprimée lorsque le script se termine.

J'aimerai aussi savoir à partir de quel répertoire il faut définir celui dans lequel le fichier doit être déplacé ? Faut-il indiquer dès la racine ou alors ignorer ceux qui sont avant la page ?

Enfin, je ne comprends pas ce qu'est "basename" ?

Que dois-je faire ? Merci de m'éclairer.

Posté : 02 juil. 2006, 13:53
par Truc
Salut,

Il n'y a rien qui concerne l'inscription en Base de données dans ces lignes donc je suppose que l'opération se passe soit avant soit après donc normal que l'inscription se fasse dans tous les cas.

Le chemin à indiquer est un chemin relatif c'est à dire qu'il part depuis ce script et monte ou descend dans l'arborescence vers la destination.

basename() n'a rien à faire la surtout pas avec la variable POST. Cette fonction récupère le nom du "fichier" donné par le chemin (dossiers) en paramètre.

Il y a destutospour l'upload qui peuvent t'aider.

Posté : 03 juil. 2006, 10:24
par BaLiSTiK
Salut,

basename() n'a rien à faire la surtout pas avec la variable POST. Cette fonction récupère le nom du "fichier" donné par le chemin (dossiers) en paramètre.

Il y a destutospour l'upload qui peuvent t'aider.
bonjour j ai un soucis sur l upload (au lieu de faire un nouveau topic je fais ici comme ça concerne la même chose) mais moi ça concerne la taille de fichier. J ai mis

Code : Tout sélectionner

<INPUT type=hidden name=MAX_FILE_SIZE VALUE=20000000>
mais ça n'envoi qu'au mieux des fichiers de 1,5 à 2Mo. J ai mis un 0 de plus à VALUE pour être sur mais toujours le même soucis :)...

Posté : 03 juil. 2006, 11:24
par Darklyth
Salut,

Merci pour vos réponses. Je suis allé voir le tuto et j'en suis venu à écrire ceci :
	if(is_uploaded_file($_FILES['avatar']['tmp_name']))
	{
	$poids_image_max="50000";
		if($infos_images=getimagesize($_FILES['avatar']['tmp_name']))
		{
			if($_FILES['avatar']['size']>$poids_image_max)
			{
			print "Votre avatar ne doit pas dépasser 50ko !";
			}
			else
			{
			$uploaddir='/avatars/';
			$uploadfile=$uploaddir.$_FILES['avatar']['name'];
				if(move_uploaded_file($_FILES['avatar']['tmp_name'],$uploadfile))
				{
				print "Fichier valide et déplaçé !<br>";
				$avatar_final=$_FILES['avatar']['name'];
				}
				else
				{
				print "Fichier non déplaçé !<br>Erreur :\n<br><br>Infos de débogage :  ";
				print_r($_FILES);
				}
			}
		}
		else
		{
		print "Votre avatar doit être un fichier de type image !";
		}
	}
	else
	{
	$avatar_final="avatar_defaut.jpg";
	}
D'après les informations de débogage il n'y a pas d'erreur mais le fichier n'est tout de même pas déplaçé... Voici ce que j'ai sur ma page une fois le script éxecuté :
Fichier non déplaçé !
Erreur :

Infos de débogage : Array ( [avatar] => Array ( [name] => 149.jpg [type] => image/pjpeg [tmp_name] => /tmp/phpjB8icR [error] => 0 [size] => 22040 ) )

Le dossier "avatars" existe bien et le CHMOD est 777. Que se passe-t-il ?

Merci d'avance pour votre aide.

Re: Problème avec l'upload d'image

Posté : 03 juil. 2006, 12:13
par HanX
Voilà, alors le problème c'est que toute la partie d'upload d'image est TOTALEMENT ignorée, que j'envoie une image de 150ko ou de moins de 50ko, l'inscription est quand même réussie, de plus l'image n'est pas déplaçée dans le dossier et est donc supprimée lorsque le script se termine.
Certains hébergeur (gratuits) limitent grandement l'upload... le mieux serait un hébergeur payant. Ou alors un probleme de timeout ? :roll:

Posté : 03 juil. 2006, 12:26
par Darklyth
Le problème de la taille est réglé, finalement le seul problème est le déplacement de fichier qui ne fonctionne pas. Mon hébergeur est un hébergeur payant et pro, c'est 1and1.

Posté : 03 juil. 2006, 12:34
par Ryle
Ton chemin n'est pas bon... il ne faut pas confondre url et chemins sur le disque. Dans ton cas tu veux déplacer un fichier sur le serveur ce qui n'a rien à voir avec l'url, mais avec l'arborescence des fichiers.

Il est recommandé pour cela d'utiliser des chemins relatifs par rapport aux scripts (cf. le message de Truc).

En effet, quand tu demandes à déplacer dans le dossier "/avatars/" il va interpréter le premier "/" comme étant la racine du disque (c'est comme si tu indiquais c:\) et cela m'étonnerai beaucoup que ton hébergeur ait un dossier avatars à la racine de son serveur, et plus encore qu'il te laisse écrire dedans ;)

Posté : 06 juil. 2006, 03:26
par Darklyth
Merci beaucoup, c'était bien ça le problème !

Maintenant, autre chose ne va pas, lorsque je redimensionne l'image avec le PHP, elle ressort complètement noire ? Comment se fait-ce ?

Voici mon code :
$largeur_destination=$largeur_max;
$hauteur_destination=$infos_image[1]*$largeur_destination/$infos_image[0];
$nouvelle_image=imagecreatetruecolor($largeur_destination,$hauteur_destination);
if($point='jpg' || $point='JPG' || $point='jpeg' || $point='JPEG')
{
header("Content-Type: image/jpeg");
$tmp1=ImageCreateFromJpeg($_FILES['photo']['tmp_name']);
$tmp2=ImageCopyResized($nouvelle_image,$_FILES['photo']['tmp_name'],0,0,0,0,$largeur_destination,$hauteur_destination,$infos_image[0],$infos_image[1]);
	if(imagejpeg($nouvelle_image,$uploadfile))
	{
	print "Photo valide et enregistrée !<br>";
	$photo_final=$fichier_final;
	$db=mysql_connect($server,$user,$passwd) or die ("Erreur de connexion SQL");
	mysql_select_db($base,$db) or die ("Erreur de connexion base");
	mysql_query("INSERT INTO photos values('','$date','$_POST[titre]','$fichier_final','$_SESSION[pseudo]','$_POST[description]','non')") or die ("Erreur insertion ".mysql_error());
	mysql_close();
	ImageDestroy($tmp1);
	ImageDestroy($tmp2);
	print "Photo ajoutée avec succès !<br><a href=?p=membres_photos>Continuer</a>";
	}
	else
	{
	print "Fichier non déplaçé ! La photo n'a pas été téléchargée correctement, veuillez <a href=?p=contact>contacter l'Administrateur</a>.";
							include('membres/ajouter_photo2.php');
	}


Merci d'avance !