[RESOLU] Récupération de variable à la suite d'un upload

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 : [RESOLU] Récupération de variable à la suite d'un upload

Re: Récupération de variable à la suite d'un upload

par Sayko » 07 févr. 2013, 11:37

Bon le fait de virer les espaces/accents, des chaines de caractères ne changent rien.

J'ai essayé de mettre le dossier upload en 755 mais ça à rien changé...

EDIT: Bon j'ai tout passé en 777 et ça fonctionne... donc visiblement c'était un soucis de droits.

Re: Récupération de variable à la suite d'un upload

par Sayko » 07 févr. 2013, 09:51

Avant tout, bonjour et merci pour ta réponse.

Je suis allé voir dans les logs apache2 et j'ai trouvé ce style de lignes:

Image

Visiblement il y a un soucis de permissions... Je vais essayer de passer le dossier en 755...

Sinon du coup je vais surement ajouter ces lignes pour filtrer un peu le nom:
$fichier = str_replace(' ','',$fichier);
$fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
Je reteste ça et je vous dis

Re: Récupération de variable à la suite d'un upload

par Gecko43 » 06 févr. 2013, 22:58

Pour le nom tmp, c'est normal, il est auto généré est n'est pas fait pour être agréable ^^.
Le nom de ton fichier est stocké dans $_FILE['addmusic_path']['name']

Sinon quelle est exactement ton problème à present ? Quelle erreur avec ce code PHP ?

Aussi :
[name] => 01 - Stabbing The Drama.mp3
+
$fichier = basename($_FILES['addmusic_path']['name']);
...
move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)
A mon avis debian/apache aime pas bien les espaces/accents.
Tu devrai traiter le nom du fichier avant d'utiliser move_uploaded_file. (suppression/remplacement des accents/espaces)
Au pire tu peu aller chercher plus de details dans tes logs apache/php si t'est sur ta VM.

Re: Récupération de variable à la suite d'un upload

par Sayko » 06 févr. 2013, 17:52

Bonjour !

Je reviens vers vous car je suis passé à l'étape suivante de mon projet; à savoir mettre mon projet sur une VM debian.

Donc, j'accède au localhost et au phpmyadmin sans aucun soucis, mais l'upload ne passe pas...
En faisant un print_r($_FILES); j'ai pu voir que j'avais un tmp_name très bizarre... je sais pas si c'est normal.

Voici le résultat de mon print_r($_FILES);
Array ( 
[addmusic_path] => Array ( 
                                        [name] => 01 - Stabbing The Drama.mp3 
                                        [type] => audio/mpeg 
                                        [tmp_name] => /tmp/phpsRsLoW 
                                        [error] => 0 
                                        [size] => 10989696 )
 ) 

Voici l'endroit ou mon fichier php me fait une déconade, pour le formulaire, c'est le même que dans le premier post:
	$dossier = 'upload/';
 				$fichier = basename($_FILES['addmusic_path']['name']);
 				$taille = filesize($_FILES['addmusic_path']['tmp_name']);
 				$extensions = array('.mp3', '.ogg', '.wav', '.aac', '.m4a', '.flac', '.wma', '.MP3', '.OGG', '.WAV', '.AAC', '.M4A', '.FLAC', '.WMA');
 				$extension = strrchr($_FILES['addmusic_path']['name'], '.');
 				//Début des vérifications de sécurité...
 				if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
 				{
 					$erreur = '<div class="error">Vous devez envoyer une musique de type mp3, ogg, wav, aac, m4a, flac ou wma.</div>';
 				}

 				if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
 				{
 					//On formate le nom du fichier ici...
 					if(move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
 					{
 						$addmusic=$database->prepare('INSERT INTO fichier(GENRE_ID, TYPE_ID, FICHIER_NOM, FICHIER_CHEMIN, FICHIER_ANNEE, FICHIER_ARTISTE, FICHIER_ALBUM, FICHIER_PRIVE, FICHIER_PROPRIO, FICHIER_NUMERO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 						$addmusic->execute(array($_SESSION['idgenre'], 1, $_POST['addmusic_titre'], $_FILES['addmusic_path']['name'], $_POST['addmusic_annee'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['confidentialite'], $_SESSION['user_id'], $_POST['addmusic_number']));
 						
 						exec(escapeshellcmd('scripts/aj_musique.sh', $_FILES['addmusic_path']['name'], $_POST['addmusic_titre'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['genre'], $_POST['addmusic_annee'], $_POST['addmusic_number']));
 						
 						echo '<div class="success">Musique ajoutée.</div>';
						unset($_SESSION['idgenre']);
						unset($_FILES['addmusic_path']['name']);
						unset($_POST['addmusic_titre']);
						unset($_POST['addmusic_artiste']);
						unset($_POST['addmusic_number']);
						unset($_POST['addmusic_album']);
						unset($_POST['addmusic_annee']);
						unset($_POST['genre']);
						unset($_POST['confidentialite']);
						header ("Refresh: 2;URL=musique.php");
 					}
 					else //Sinon (la fonction renvoie FALSE).
 					{
 						print_r($_FILES);
 						echo '<div class="error">Échec de l\'upload !</div>';
 					}
 				}
 				else
 				{
 					echo $erreur;
 				}

Merci par avance pour votre aide!

Cordialement,

Re: Récupération de variable à la suite d'un upload

par Sayko » 01 févr. 2013, 17:54

Je m'en suis rendu compte quelques minutes après mon dernier post en effet mais je n'avais pas redémarré les services comme un c** (c'est la première fois que je modifiais le php.ini).

Cela fonctionne bien à présent! Merci beaucoup de m'avoir mis sur la piste !

Je passe en résolu.

Re: Récupération de variable à la suite d'un upload

par Mazarini » 01 févr. 2013, 15:28

Il y a 2 php.ini : 1 pour apache et 1 en ligne de commandes, peut être que tu n'as pas modifié le bon ?
(la remarque sur le redémarrage d'apache pour la prise en compte reste valable bien sûr)

Re: Récupération de variable à la suite d'un upload

par dix2 » 01 févr. 2013, 14:54

t'as redémarré le serveur ?

Re: Récupération de variable à la suite d'un upload

par Sayko » 01 févr. 2013, 14:43

Bizarre... j'ai changé manuellement les valeurs dans le php.ini et fixé celles précisées dans mon premier message mais dans le phpinfo() il semble ne pas avoir pris en compte mon changement...

file_uploads On On
post_max_size 8M 8M
upload_max_filesize 2M 2M
upload_tmp_dir c:/wamp/tmp c:/wamp/tmp

Sinon oui je suis en x64.

Mais je ne vois pas pourquoi ce n'est pas appliqué...

Re: Récupération de variable à la suite d'un upload

par Mazarini » 01 févr. 2013, 12:47

UPLOAD_ERR_OK: 0
UPLOAD_ERR_INI_SIZE: 1
UPLOAD_ERR_FORM_SIZE: 2
UPLOAD_ERR_NO_TMP_DIR: 6
UPLOAD_ERR_CANT_WRITE: 7
UPLOAD_ERR_EXTENSION: 8
UPLOAD_ERR_PARTIAL: 3

A priori 1 signifie qu'il y a une erreur sur la taille du fichier par rapport au fichier php.ini.

Tu peux faire une page <?PHP phpinfo() ?> pour voir la taille autorisée et le nombre de fichiers :
php.ini:
- file_uploads = On <= faute de frappe ?
- post_max_size = 2050M
- upload_max_filesize = 2048M
Edit : rassures moi, tu n'es pas en 32 bit ? Parce que dans ce cas il faut que tu vérifies la valeur max d'un entier... Mais phpinfo() devrait te mettre sur la voie.

Re: Récupération de variable à la suite d'un upload

par Sayko » 01 févr. 2013, 09:49

Voici le contenu de la commande "print_r($_FILES);":
Array ( [addmusic_path] => Array ( 
                        [name] => 1 - Invigorate.mp3 
                        [type] => [tmp_name] => 
                        [error] => 1 
                        [size] => 0 ) 
                        ) 

Quant à la commande "echo $_FILES['addmusic_path']['error'];": 1 (normal quoi).


Je ne vois vraiment pas comment résoudre ce soucis...

Re: Récupération de variable à la suite d'un upload

par Mazarini » 01 févr. 2013, 09:19

print_r($_FILES); pour voir le contenu de la variable.
Il faudra également tester si une erreur s'est produite $_FILES['addmusic_path']['error'] par la suite.

Récupération de variable à la suite d'un upload

par Sayko » 01 févr. 2013, 03:13

Bonjour à tous!

Et bien voila *S'allonge sur le divan* Je bloque depuis 4 bonnes heures sur un formulaire et j'ai besoin d'aide.

En effet, je cherche à upload un fichier et celui-ci de retrouve visiblement pas mon $_FILES... Handicapant n'est-ce pas?

Voyez plutôt mes deux fichiers

Dans un premier temps le HTML: "musique.php"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>StarBox - Musique</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			?>
			
			<div class="starbox">
			
			<?php echo "Bonjour " . $_SESSION['login'] . "."; ?>
			
			<form class="starbox" name="addmusic" method="post" action="business_addmusic.php" enctype="multipart/form-data" OnSubmit="return Send()">
			<a href="home.php"><< Accueil</a> <br />
			<h1>Ajouter une musique</h1>
			<table class="addmusic">
				<tr colspan="2">
					<td>Fichier à ajouter:<br />
					<input name="addmusic_path" type="file" />*<br /><br /></td>
				</tr>
				<tr>
					<td>Titre:<br />
					<input type="text" name="addmusic_titre" />*<br /><br /></td>
					<td>Artiste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_artiste" /><br /><br /></td>
				</tr>
				<tr>
					<td>Numéro de piste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_number" /><br /><br /></td>
					<td>Nom de l'album: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_album" /><br /><br /></td>
				</tr>
				<tr>
					<td>Année:<i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_annee" /><br /><br /></td>
				</tr>
				<tr>
					<td colspan="2">Genre(s):<br />
								<?php 
								$genresmusic=$database->query('SELECT GENRE_ID, GENRE_NOM FROM genre WHERE GENRE_TYPE = 1 ORDER BY GENRE_NOM');
								while($val = $genresmusic->fetch())
								{
									echo '<input type="radio" name="genre" value="'.$val['GENRE_NOM'].'" id="'.$val['GENRE_ID'].'" /> <label for="'.$val['GENRE_ID'].'">'.$val['GENRE_NOM'].'</label>';
								}
								?>
					<br /><br /></td>
				</tr>
				<tr>
					<td>Confidentialité:<br />
					<input type="checkbox" id="private" name="confidentialite" value="Privé"/><label for="private">Privé</label><br /><br /></td>
				</tr>
			</table>
			<input type="submit" value="Ajouter la musique" />
			</form>
			</div>
			<?php 
		}
		?>
	</body>
</html>



Et dans un second temps le PHP: "business_addmusic.php"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Redirection...</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			
			if ($_FILES['addmusic_path']['name'] != "" and $_POST['addmusic_titre'] != "") {
				
				if ($_POST['addmusic_artiste'] == "") {
					$_POST['addmusic_artiste'] = "Inconnu";
				}
				
				if ($_POST['addmusic_number'] == "") {
					$_POST['addmusic_number'] = "NA";
				}
				
				if ($_POST['addmusic_album'] == "") {
					$_POST['addmusic_album'] = "Inconnu";
				}
				
				if ($_POST['addmusic_annee'] == "") {
					$_POST['addmusic_annee'] = "Inconnue";
				}
				
				if (!isset($_POST['genre'])) {
					$_POST['genre'] = "Divers";
				}
				
				if (isset($_POST['confidentialite'])) {
					$_POST['confidentialite'] = 1;
				}
				else {
					$_POST['confidentialite'] = 0;
				}
				
				$idgenre=$database->prepare('SELECT GENRE_ID FROM genre WHERE GENRE_NOM = "'.$_POST['genre'].'" AND GENRE_TYPE = 1');
				$idgenre->execute();
				$data = $idgenre->fetch();
				
				$_SESSION['idgenre'] = $data['GENRE_ID'];
				
				echo $_SESSION['idgenre'].'<br />';
				echo $_SESSION['user_id'].'<br />';
				echo $_FILES['addmusic_path']['name'].'<br />';
				echo $_POST['addmusic_titre'].'<br />';
				echo $_POST['addmusic_artiste'].'<br />';
				echo $_POST['addmusic_number'].'<br />';
				echo $_POST['addmusic_album'].'<br />';
				echo $_POST['addmusic_annee'].'<br />';
				echo $_POST['genre'].'<br />';
				echo $_POST['confidentialite'].'<br />';
				
 				$addmusic=$database->prepare('INSERT INTO fichier(GENRE_ID, TYPE_ID, FICHIER_NOM, FICHIER_CHEMIN, FICHIER_ANNEE, FICHIER_ARTISTE, FICHIER_ALBUM, FICHIER_PRIVE, FICHIER_PROPRIO, FICHIER_NUMERO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 				$addmusic->execute(array($_SESSION['idgenre'], 1, $_POST['addmusic_titre'], $_FILES['addmusic_path']['name'], $_POST['addmusic_annee'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['confidentialite'], $_SESSION['user_id'], $_POST['addmusic_number']));
 				
 				$dossier = 'upload/';
 				$fichier = basename($_FILES['addmusic_path']['name']);
 				$taille = filesize($_FILES['addmusic_path']['tmp_name']);
 				$extensions = array('.mp3', '.ogg', '.wav', '.aac', '.m4a', '.flac', '.wma');
 				$extension = strrchr($_FILES['addmusic_path']['name'], '.');
 				//Début des vérifications de sécurité...
 				if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
 				{
 					$erreur = 'Vous devez envoyer une musique de type mp3, ogg, wav, aac, m4a, flac ou wma.';
 				}

 				if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
 				{
 					//On formate le nom du fichier ici...
 					if(move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
 					{
 						echo '<div class="success">Musique ajoutée.</div>';
						unset($_SESSION['idgenre']);
						unset($_FILES['addmusic_path']['name']);
						unset($_POST['addmusic_titre']);
						unset($_POST['addmusic_artiste']);
						unset($_POST['addmusic_number']);
						unset($_POST['addmusic_album']);
						unset($_POST['addmusic_annee']);
						unset($_POST['genre']);
						unset($_POST['confidentialite']);
						header ("Refresh: 2;URL=musique.php");
 					}
 					else //Sinon (la fonction renvoie FALSE).
 					{
 						echo 'Échec de l\'upload !';
 					}
 				}
 				else
 				{
 					echo $erreur;
 				}
				
				
			}
			else {
				echo '<div class="error">Merci de remplir tous les champs obligatoires.</div>';
				unset($_SESSION['idgenre']);
				unset($_FILES['addmusic_path']['name']);
				unset($_POST['addmusic_titre']);
				unset($_POST['addmusic_artiste']);
				unset($_POST['addmusic_number']);
				unset($_POST['addmusic_album']);
				unset($_POST['addmusic_annee']);
				unset($_POST['genre']);
				unset($_POST['confidentialite']);
				header ("Refresh: 2;URL=musique.php");
			}
		}
		?>


L'erreur que j'obtiens est un magnifique "Undefined index: addmusic_path" à chaque fois que j'essaye d'utiliser $_FILES['addmusic_path'] dans mon fichier "business_addmusic.php".

Voila voila... J'ai cherché sur plusieurs forums et tous les problèmes qui ce posent son souvent dus au enctype="multipart/form-data" qui est ici bel et bien présent ou bien alors au php.ini. J'ai modifié le mien car l'appli web va a terme fonctionner uniquement en local.

Infos utiles:
- navigateur Firefox (mais je vous "rassure" ça fonctionne pas non plus sous IE -_-)

php.ini:
- file_uploads = On
- post_max_size = 2050M
- upload_max_filesize = 2048M (c'est très gros car je compte par la suite pouvoir upload des films)


En tout cas je vous remercie par avance des conseils avisés que vous pourrez me donner !!

Bonne journée à vous. (ou plutôt nuit.)


PS: je me doute que ça doit être codé un peu crade :s, je suis dans l'ingénierie réseau, pas en dev' ^^"