Page 1 sur 6

pb upload (changement : caractère spéciaux et UTF-8)

Posté : 26 août 2011, 23:55
par arthur77
Bonjour,
voila j'ai fait un système d'upload avec un formulaire poster.php qui pointe vers le système d'uploard upload.php, sauf que meme en mettant un bon fichier comme demande ça m'indique que l'upload n'a pas fonctionné et dans mon dossier d'upload il n'y a rien ... voici mes codes :

Poster.php
<form method="POST" action="upload.php" enctype="multipart/form-data">
				<!-- On limite le fichier à 5Mo -->
				<input type="hidden" name="MAX_FILE_SIZE" value="5242880">
				Fichier : <input type="file" name="song">
				<label for="style"> Style musical de la chanson : </label>
				<select name="style" id="style" >
					<option value="blues" > Blues </option>
					<option value="chanson_francaise" > Chanson Fran&ccedil;aise </option>
					<option value="classique" id="classique" > Classique </option>
					<option value="club" > Club </option>
				</select>
						<input type="submit" value="envoyer" value="Envoyer le fichier">
			</form>
upload.php
<?php
		$nberreur = 0;
		$dossier = 'musiques/';
		$fichier = basename($_FILES['song']['name']);
		$taille_maxi = 5242880;
		$taille = filesize($_FILES['song']['tmp_name']);
		$extensions = array('.mp3');
		$extension = strrchr($_FILES['song']['name'], '.'); 
		//Début des vérifications de sécurité...
			if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
				{
				$extension_ok = 0;
				$nberreur = 1;
				}
			else
				{
				$extension_ok = 1;
				}
			if($taille>$taille_maxi)
				{
				$taille_ok = 0;
				$nberreur = 1;
				}
			else
				{
				$taille_ok = 1;
				}
		if($nberreur == 0) //S'il n'y a pas d'erreur, on upload
			{
			//On formate le nom du fichier
			$fichier = strtr($fichier, 
				'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
				'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
			$fichier = str_replace(' ','_',$fichier);
			$fichier = str_replace('-','_',$fichier);
			$fichier = str_replace("'",''',$fichier);
			if(move_uploaded_file($_FILES['song']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
				{
				?>
				<p>
				Chanson uploadée avec succ&eacute;s !<br />
				<a href="index.php" alt="index"> Retourner &agrave; l'acceuil </a><br />
				</p>
				<?php
				}
			else //Sinon (la fonction renvoie FALSE).
				{
				?>
				<p>
				Echec de l'upload, veuillez recommencer.<br />
				<a href="poster.php" alt="retour"> Retour </a>
				<?php
				}
			}
		else
			{
			if ($extension_ok == 0)
				{
				?><p>L'extension n'est pas bonne, veuillez s&eacute;lectionner un fichier .mp3 <br/></p><?php
				}
			if ($taille_ok == 0)
				{
				?><p>Le fichier est trop gros, la taille maximale est 5Mo. <br /></p><?php
				}
			if ($nberreur == 1)
				{
				?><p><a href="poster.php" alt="retour"> Retour</a></p><?php
				}
			}
Voila si quelqu'un peut m'aider, ça serait fort aimable ! :D

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 01:55
par sadeq
Bonjour,

Tu peux insérer un echo $fichier; après cette ligne pour voir si le nom du fichier généré est correct:
$fichier = str_replace("'",''',$fichier);

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 14:43
par arthur77
J'ai rajouté cette ligne, et il m'affiche :
02_junebug.mp3
alors que le titre de ma chanson (dans mon explorateur Windows) est :
02-junebug
J'ai l'impression qu'il n'a pas rajouté le dossier de destination avant le titre non ?

Merci :D

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 16:14
par sirakawa
J'ai rajouté cette ligne, et il m'affiche :
02_junebug.mp3
J'ai l'impression qu'il n'a pas rajouté le dossier de destination avant le titre non ?

Merci :D
C'est sûr qu'il ne risque pas d'aficher le répertoire qui n'a pas été ajouté, puisqu'il est ajouté après...
$fichier = str_replace("'",''',$fichier);
echo($fichier);
if(move_uploaded_file($_FILES['song']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
Ce qui serait malin ce serait:
$cible = $dossier.$fichier;
echo($cible);
En revanche, un tel code suppose la présence d'un sous-répertoire musiques juste en-dessous du répertoire où se trouve le script. et que apache ait le droit d'y écrire..

j'ai aperçu dans la doc de upload (http://fr2.php.net/manual/fr/features.f ... method.php).
$_FILES['userfile']['size'];

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 16:48
par arthur77
J'ai rajouté
$cible = $dossier.$fichier;
echo($cible);
Comme tu as dit, il m'affiche maintenant :
musiques/02_junebug.mp3
Je bosse en Local, donc lecture/ecriture est tout le temps autorisé non ? ou alors je dois faire le CHMOD quand meme ?

Voila le détail de mon repertoire :

http://imageshack.us/photo/my-images/402/siteyp.jpg/

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 17:07
par sirakawa
c'est Apache (ou le nom du démon Web) qui doit pouvoir écrire (le plus simple à mon avis c'est de faire un chgrp apache et de vérifier que le groupe a le droit d'écrire

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 17:47
par moogli
hum a vu de nez l'est sous windoze donc, normalement pas de soucis (sauf s'il joue à l'admin et qu'il a fait le malin, par contre je ne pense pas si les fonctions ch group/mode fonctionne sous win étant donnée que c'est pas vraiment la même chose ? j'avoue j'ai jamais cherché a savoir ^^).


quand tu dit "ça m'indique que l'upload n'a pas fonctionné" c'est que tu a le message
<p>
                                Echec de l'upload, veuillez recommencer.<br />
                                <a href="poster.php" alt="retour"> Retour </a>
</p>
qui s'affiche ?

si oui c'est le move_uploaded_file qui foire, en général c'est un pb d'emplacement ou de trois comme il t'a déjà été indiqué avant, faut afficher la cible (t'a déjà un exemple) et la source.

sinon :

ajoute un var_dump($_FILES); à la 1ère ligne de ton upload.php et dit nous ce que raconte :)

attention a la taille max de ton fichier car il deux limite, celle de la taille max des fichiers que l'on peux envoyer (2Mo par défaut) et la taille max des données via le formulaire (8Mo).

@+

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 23:21
par arthur77
Oui moogli c'est bien ce message :
<p>
                                 Echec de l'upload, veuillez recommencer.<br />
                                 <a href="poster.php" alt="retour"> Retour </a>
</p>
sue j'obtiens a chaque fois ...

pour la taille, j'ai moi meme bloqué a 5Mo c'est bon ? et quand je teste je respecte bien ça avec mes fichiers ...

avec le var_dump($_FILES); j'obtient :
array
'song' =>
array
'name' => string '02 - junebug.mp3' (length=16)
'type' => string '' (length=0)
'tmp_name' => string '' (length=0)
'error' => int 1
'size' => int 0
je vois 'error' => int 1 , il y a une erreur ???? :(

la cible, je l'a fait donc afficher avec :
$cible = $dossier.$fichier;
echo($cible);
j'obtient :
musiques/02_junebug.mp3
Comment je fait pour afficher la source ?

merci :D

Re: upload qui ne fonctionne pas

Posté : 27 août 2011, 23:56
par Ryle
http://fr.php.net/manual/fr/features.fi ... errors.php
Valeur : 1. Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.
Le fichier que tu envois a une taille supérieure à ce qui est autorisé par on fichier .ini

En fait, php a une limite par défaut à 2Mo pour l'upload du fichier. Si tu ne modifies pas la valeur de upload_max_filesize dans ton php.ini, tout ce qui fait plus de 2Mo sera rejeté par défaut, quelque soit la taille max que tu spécifies ensuite dans ton code... il faut donc augmenter cette valeur max dans le .ini (au moins à 5Mo, mais ça peut être plus, et une fois que le tuyau est ouvert, tu pourras contrôler et bloquer à 5Mo dans ton code :))

Re: upload qui ne fonctionne pas

Posté : 28 août 2011, 22:52
par arthur77
J'ai modifié cette valeur dans mon php.ini , j'ai donc maintenant (pour cette section du php.ini) ça :
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
upload_tmp_dir = "c:/wamp/tmp"

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 8M
et pourtant toujours le meme résultat ...

Merci ! :D

Re: upload qui ne fonctionne pas

Posté : 29 août 2011, 00:00
par Ryle
Tu as redémarré ton serveur wamp après avoir modifié la php.ini ?

Et si tu essayes avec un fichier d'upload plus petit, tu as toujours la même erreur ?

Re: upload qui ne fonctionne pas

Posté : 29 août 2011, 05:55
par AB
Pour gérer les erreurs de dépassement du post et éviter une page blanche en réponse tu peux regarder ce tuto... et éventuellement utiliser la classe qui est donnée en lien.

Re: upload qui ne fonctionne pas

Posté : 29 août 2011, 10:52
par arthur77
@Ryle : Oui je viens de réessayer avec Wamp redémarrer, l'upload ne fonctionne pas mais maintenant pour var_dump($_FILES) j'obtient :
array
'song' =>
array
'name' => string '02 - junebug.mp3' (length=16)
'type' => string '' (length=0)
'tmp_name' => string '' (length=0)
'error' => int 2
'size' => int 0

J'ai regardé dans la doc la signification de 'error' => int 2, et c'est que le fichier est suppérieur a la valeur que j'ai indiquée dans mon formulaire ... or non !

@AB : Je vais lire attentivement ton tuto , je corrigerais mon code après l'avoir lut je te tiendrais au courant ...

Merci !! :D

Re: upload qui ne fonctionne pas

Posté : 31 août 2011, 15:25
par arthur77
Wow AB ton tuto fonctionne parfaitement, en 2 secondes je l'avait adapté à mon site ! Un grand merci !! :D

Mais, :( , je voulais enregistré dans ma BDD MySQL des infos sur la chanson envoyée si l'upload avait correctement fonctionné. J'ai donc rajouté ce code : (je met toute la boucle d'upload avec move_upload_files pour comprendre, la partie intéressante et l'insertion dans la BDD)
if(@move_uploaded_file($_FILES['userfile']['tmp_name'], $adresse_fichier))
                                                                                                                                                                            
                 {
                         // Nom du fichier final
                         $nom_fichier = basename($adresse_fichier);
        
                         // Préparation des messages de confirmation
                         $resultat1 = 'Le fichier "'.$localfile.'" a &eacute;t&eacute; t&eacute;l&eacute;charg&eacute; sur le serveur';
                         $resultat2 = 'Le fichier "'.$localfile.'" renomm&eacute; "'.$nom_fichier.'" a &eacute;t&eacute; t&eacute;l&eacute;charg&eacute; sur le serveur';
                                                 
                         // Création du message de confirmation
                         $_SESSION['resultat_telecharg'] = $localfile === $nom_fichier ?  $resultat1 : $resultat2;

						 
						 //Puis on enregistre les infos dans la BDD
						 if (isset($_POST['description'])) //si la description est remplie
							{
							$description = $_POST['description'];
							}
						else   // si la description est vide
							{
							$description = ''; 
							}
		
						//on transfere les infos sur l'artiste
						$titre = $nom_fichier;
						$artiste = $pseudo;
						$idartiste = $_SESSION['id'];
						$vues = 0;
						$note = 0;
						//et on créer la nouvelle musique dans la BDD "musiques" avec les infos récupérées
						$insert = $connexion->prepare('INSERT INTO chansons(titre, artiste, idartiste, dateenvoi, vues, note, description) VALUES(:titre, :idartiste, NOW(), :vues, :note, :description)');
						$insert->execute(array(
								'titre' => $titre,
								'artiste' => $artiste,
								'idartiste' => $idartiste,
								'vues' => $vues,
								'note' => $note,
								'description' => $description
								));
				}
Voila, l'upload fonctionne a chaque fois correctement, mais aucune trace des infos dans ma BDD ...
Merci :D

Re: upload qui ne fonctionne pas

Posté : 31 août 2011, 17:46
par moogli
que retourne $insert->execute ?

pas de try /catch ?

comme ça au pif utilisation obsolète de l'auto déclaration des variables formulaire ?

@+