Renommer un fichier après upload...

Korben
Invité n'ayant pas de compte PHPfrance

19 juil. 2007, 13:04

... Eh oui, encore une bête question sur "comment renommer un fichier uploadé via un formulaire ?"

Mon problème est toutefois un peu plus "complexe" (je n00b) qu'il n'y parait, car je souhaiterai que le fichier uploadé prenne le nom d'une variable (correspondant en fait à un nom d'utilisateur précédemment sélectionné :wink: )

Je ne suis peut-être pas très clair, je vais donc vous fournir quelques bribes de pages, en espérant que vous pourrez m'aider à résoudre ce problème :?

Dans le haut de ma page (avant </head>)
// Constantes pour l'upload des imgaes
$folder     = '../images/';  // Repertoire cible
$extension  = 'jpg';      // Extension du fichier sans le .

$max_size   = 100000;     // Taille max en octets du fichier
$width_max  = 120;        // Largeur max de l'image en pixels
$height_max = 180;        // Hauteur max de l'image en pixels

$nom_file   = $_FILES['fichier']['name'];
$taille     = $_FILES['fichier']['size'];
$tmp        = $_FILES['fichier']['tmp_name']; 
Mon formulaire
		<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">		
		<table class="categories" align="center" cellpadding="3" style="font-size:11px">
		<tr style="color:<?php echo $stylecol_titre; ?>;background-color:<?php echo $cadre_bgc_titre; ?>"><td align="center" colspan="3" style="font-size:12px">Gestion des photos (<strong><?php echo (isset($row['nom']) ? $row['nom'] : '?'); ?></strong>)</td></tr>
			<tr><td align="right">Fichier :</td><td><input type="file" name="fichier" /></td>
				<td rowspan="2" width="70%">L'upload est uniquement valable avec des fichiers ayant une extension <strong>*.jpg</strong>, tous les autres formats (*.bmp, *.png, *.gif et même *.jpeg) d'image seront syst&eacute;matiquent refus&eacute;s !
				<br /><br />Limitations d'upload : <strong>Taille :</strong> <?php echo $max_size/1000; ?>Ko maximum - <strong>Dimensions :</strong> <?php echo $width_max; ?> (L) par <?php echo $height_max; ?> (H).
				<br /><br />Par ailleurs, veillez à bien sélectionner un nom dans la liste ci-dessus avant d'envoyer le fichier !</td></tr>
			<tr><td align="center" colspan="2" width="30%"><input type="submit" name="action" value="Go go go !" style="width:100px" /></td></tr>
		</table>
		</form>
Le script d'upload a proprement parlé
	else if(isset($_POST['action']) and $_POST['action'] == "Go go go !") {
		// On vérifie si le champ est rempli
		if(!empty($_FILES['fichier']['name'])) {
			// On vérifie l'extension du fichier
			if(substr($nom_file, -3) == $extension) {
				// On récupère les dimensions du fichier
				$infos_img = getimagesize($_FILES['fichier']['tmp_name']);
            
				// On vérifie les dimensions et taille de l'image
				if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($_FILES['fichier']['size'] <= $max_size)) {
					// Si c'est OK, on teste l'upload
					if(move_uploaded_file($tmp , $folder . $nom_file)) {
						// Si upload OK alors on affiche le message de réussite
						echo '<b>Image uploadée avec succès !</b>';
						echo '<hr />';
						echo '<b>Fichier :</b> ', $_FILES['fichier']['name'], '<br />';
						echo '<b>Taille :</b> ', $_FILES['fichier']['size'], ' octets<br />';
						echo '<b>Largeur :</b> ', $infos_img[0], ' px<br />';
						echo '<b>Hauteur :</b> ', $infos_img[1], ' px<br />';
						echo '<hr />';
						echo '<br /><br />';
					}
					else {
						// Sinon on affiche une erreur système
						echo '<b>Problème lors de l\'upload !</b><br /><br /><b>', $_FILES['fichier']['error'], '</b><br /><br />';
					}
				} 
				else {
					// Sinon on affiche une erreur pour les dimensions et taille de l'image
					echo "<script type=\"text/javascript\"> alert(\"Veuillez vérifier la taille ainsi que les dimensions de l'image !\");</script>";
				}
			} 
			else {
				// Sinon on affiche une erreur pour l'extension
				echo "<script type=\"text/javascript\"> alert(\"Désolé, mais le fichier $nom_file ne comporte pas l\'extension .jpg !\");</script>";
			}
		}
		else {
			// Sinon on affiche une erreur pour le champ vide
			echo "<script type=\"text/javascript\"> alert(\"Le champ du formulaire est vide !\");</script>";
		}	
	mysql_close();  // Fermeture de  la connexion 
	}
Ce que j'aimerai donc, c'est affecter à l'image uploadée le nom contenu dans $row['nom'] que j'appelle par exemple dans le <tr> du tableau :)

Vous avez la soluce miracle ?


Je suis là si vous manquez d'informations ! (je peux également poster la page dans son intégralité si certaines choses vous échappent, suffit de me demander !)

d0m
Mammouth du PHP | 1141 Messages

19 juil. 2007, 13:50

si je comprends bien tu voudrais faire l'upload de l'image avec un nom différents que l'image actuelle?

Il suffit de mettre le nouveau nom en paramètre dans la fonction move_uploaded_file non?
(move_uploaded_file($tmp , $folder . $row['nom'])) 
ou ai-je mal compris?

Korben
Invité n'ayant pas de compte PHPfrance

19 juil. 2007, 14:21

Tu as bien compris ce que je souhaite faire :)

Néanmoins, cette démarche me retourne 2 erreurs PHP. Il ne semble pas possible d'intégrer ce genre de code dans un move_uploaded_file !

Si seulement c'était aussi simple =\

J'en profite pour ajouter que j'ai déjà essayé d'ajouter un champ input pour le poster le nom en même temps que l'image, mais ça n'a pas fonctionné, l'image est uploadée, mais tout se passe comme si l'input n'était pas renseignée après avoir validé l'upload :?

d0m
Mammouth du PHP | 1141 Messages

19 juil. 2007, 14:27

Néanmoins, cette démarche me retourne 2 erreurs PHP. Il ne semble pas possible d'intégrer ce genre de code dans un move_uploaded_file !
Tu peux écrire les erreurs?
J'en profite pour ajouter que j'ai déjà essayé d'ajouter un champ input pour le poster le nom en même temps que l'image, mais ça n'a pas fonctionné, l'image est uploadée, mais tout se passe comme si l'input n'était pas renseignée après avoir validé l'upload :?
bizarre parce que si tous les champs sont dans le même formulaire, en validant ce dernier tu devrais avoir le nom disponible..., aucune raison de ne pas l'avoir.

Invité
Invité n'ayant pas de compte PHPfrance

19 juil. 2007, 14:30

Code : Tout sélectionner

Warning: move_uploaded_file(../images/) [function.move-uploaded-file]: failed to open stream: Is a directory in /mnt/132/free.fr/3/1/kaot/forum/mdbfc/pages/administration/staff2.php on line 142 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/mnt/132/free.fr/3/1/kaot/phpLPk4g6' to '../images/' in /mnt/132/free.fr/3/1/kaot/forum/mdbfc/pages/administration/staff2.php on line 142
La ligne 142 correspond à la ligne du move_uploaded_file :wink:

Je te remercie de prêter attention à mon cas, il s'agit très certainement d'un détail tout bête auquel je (on) ne pense pas :roll:

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

19 juil. 2007, 16:56

La fonction move_uploaded_file() prends deux chaines en arguments... que ce soit du texte entre apostrophes/guillemets, des variables contenant du texte, ou des chaines et des variables concaténées, tout ce qui compte c'est qu'au final tu lui passes bien le nom du fichier à déplacer et le chemin + le nom du fichier ou le mettre :)

Si ta variable $row['nom'] est vide, alors ta chaine est incomplète (manque le nom du fichier) et une erreur est renvoyée : il essaye de copier et renommer l'image sur "../images/" qui est un dossier et non pas un fichier (cf. message d'erreur)

Il te faut soit rejouer la requête pour pouvoir renseigner à nouveau $row, soit ajouter un champ hidden dans ton formulaire avec cette valeur pour la récupérer... dans tous les cas, au chargement d'une page, à l'exception des cookies et variables de session, toutes les variables sont remises à zéro (voire inexistantes)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Korben
Invité n'ayant pas de compte PHPfrance

19 juil. 2007, 18:36

D'accord, je vais donc tâcher d'envoyer $row['nom'] en même temps que la requête, dans le formulaire... je vous tiens au courant ^^

:)

Korben
Invité n'ayant pas de compte PHPfrance

19 juil. 2007, 19:18

o_O

Les voies du PHP sont impénétrables. J'ai finalement réussi à renommer mes fichiers uploadés grâce à un input hidden dans le formulaire, mais un nouveau problème se pose : le fichier renommé ne comporte qu'une seule et unique lettre (la première lettre du nom en fait ;) ), ce qui me donne des fichiers "a.jpg", "b.jpg" etc.

Je n'ai pourtant nullement défini de nombres de caractères maximaux ou autres choses du genre !

A toute fin utile, je vous donne les éléments concernés de ma page.

Mes nouvelles constantes
// Constantes pour l'upload des imgaes
$folder     = '../images/';	// Repertoire cible
$extension  = '.jpg';		// Extension du fichier

$max_size   = 100000;		// Taille max en octets du fichier
$width_max  = 120;			// Largeur max de l'image en pixels
$height_max = 180;			// Hauteur max de l'image en pixels

$nom_final 	= strtolower(str_replace(array('.', ',', '?', '!', ':', '_', ' ', '.'), '_',$_POST['final']['name']));
$nom_file   = $_FILES['fichier']['name'];
$taille     = $_FILES['fichier']['size'];
$tmp        = $_FILES['fichier']['tmp_name'];
Mon nouveau formulaire
		<form enctype="multipart/form-data" action="" method="post">		
		<table class="categories" align="center" cellpadding="3" style="font-size:11px">
		<tr style="color:<?php echo $stylecol_titre; ?>;background-color:<?php echo $cadre_bgc_titre; ?>"><td align="center" colspan="3" style="font-size:12px">Gestion des photos (<strong><?php echo (isset($row['nom']) ? $row['nom'] : '?'); ?></strong>)</td></tr>
			<tr><td align="right">Fichier :</td><td><input type="file" name="fichier" /></td>
				<td rowspan="2" width="70%">L'upload est uniquement valable avec des fichiers ayant une extension <strong>*.jpg</strong>, tous les autres formats (*.bmp, *.png, *.gif et même *.jpeg) d'image seront syst&eacute;matiquent refus&eacute;s !
				<input type="hidden" name="final" value="<?php echo (isset($row['nom']) ? $row['nom'] : '?'); ?>" />
				<br /><br />Limitations d'upload : <strong>Taille :</strong> <?php echo $max_size/1000; ?>Ko maximum - <strong>Dimensions :</strong> <?php echo $width_max; ?> (L) par <?php echo $height_max; ?> (H).
				<br /><br />Par ailleurs, veillez à bien sélectionner un nom dans la liste ci-dessus avant d'envoyer le fichier !</td></tr>
			<tr><td align="center" colspan="2" width="30%"><input type="submit" name="action" value="Go go go !" style="width:100px" /></td></tr>
		</table>
		</form>
Mon nouveau script (je ne le poste pas dans son intégralité :wink: )
	else if(isset($_POST['action']) and $_POST['action'] == "Go go go !") {
	extract($_POST);	
		// On vérifie si le champ est rempli
		if(!empty($_FILES['fichier']['name'])) {
			// On vérifie l'extension du fichier
			if(substr($nom_file, -4) == $extension) {
				// On récupère les dimensions du fichier
				$infos_img = getimagesize($_FILES['fichier']['tmp_name']);
            
				// On vérifie les dimensions et taille de l'image
				if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($_FILES['fichier']['size'] <= $max_size)) {
					// Si c'est OK, on teste l'upload
					if(move_uploaded_file($tmp , $folder . $nom_final . $extension)) {
						// Si upload OK alors on affiche le message de réussite
						echo '<b>Image uploadée avec succès !</b>';
						echo '<hr />';
						echo '<b>Fichier :</b> ', $_FILES['fichier']['name'], '<br />';
						echo '<b>Renomm&eacute; :</b> ', $nom_final . $extension, '<br />';
						echo '<b>Taille :</b> ', $_FILES['fichier']['size'], ' octets<br />';
						echo '<b>Largeur :</b> ', $infos_img[0], ' px<br />';
						echo '<b>Hauteur :</b> ', $infos_img[1], ' px<br />';
						echo '<hr />';
						echo '<br /><br />';
					}
D'après vous, qu'est-ce qui pêche dans mon code ? Je sèche vraiment sur ce coup là :?

d0m
Mammouth du PHP | 1141 Messages

20 juil. 2007, 08:36

je pense que le problème vient de là :
$nom_final     = strtolower(str_replace(array('.', ',', '?', '!', ':', '_', ' ', '.'), '_',$_POST['final']['name']));
la valeur de row['name'] (chaine de caractère) se trouve dans $_POST['final'].
en faisant $_POST['final'][j] tu choisi la j-ème lettre de la chaine.

Korben
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 15:42

Comment puis-je contourner ce problème ?

Car j'ai fait passer cette données en post, c'était la seule méthode viable dans mon cas !

Quelle galère pour se simplifier la vie ultérieurement, j'vous jure :lol:

d0m
Mammouth du PHP | 1141 Messages

27 juil. 2007, 15:53

Pas besoin de "contourner" ce problème, normalement il n'y a pas de problème. Tu t'es juste perdu dants tes tableaux :
<input type="hidden" name="final" value="<?php echo (isset($row['nom']) ? $row['nom'] : '?'); ?>" />
Comme je le disais tu as ton nom $row['nom'] dans $_POST['final'].
Tu veux faire le remplacement sur la chaine contenu dans $row['nom'] et donc dans $_POST['final'].
$nom_final     = strtolower(str_replace(array('.', ',', '?', '!', ':', '_', ' ', '.'), '_',$_POST['final']));
En mettant encore des [] comme tu l'as fait, tu va chercher le caractère à la position 'name' ce qui ne veut rien dire donc il te renvoie le 1er.

Korben
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 15:59

Y'a moyen d'être con des fois ! :roll: :roll:

Le modérateur peut mettre ce topic ce topic comme résolu :)

Grand merci à d0m et Ryle :wink: