8791 sujets

Développement web côté serveur, CMS

Bonsoir à tous et à toutes,

Récemment, je me suis mis à faire un formulaire permettant à un internaute d'uploader une image selon plusieurs restrictions.

Parmi ces restrictions, il y a celle de la taille (en mo) de l'image.

Dans le tutoriel que je l'ai lu pour faire mon formulaire d'upload, l'auteur nous dit qu'il faut mettre cette ligne de protection mais qu'elle n'est pas infranchissable, loin de là.

	
<input type="hidden" name="MAX_FILE_SIZE" value="12345" />


Ensuite, il faudra vérifier la taille de l'image avec cette nouvelle ligne de code mais cette fois-ci en PHP :


$_FILES['monimage']['size'] <= 1000000 // Par exemple.


Première question que j'ai à vous poser, es-ce vraiment utile et judicieux d'utiliser MAX_FILE_SIZE ? Étant donné que cette protection est facilement contournable autant ne pas l'utiliser ?

Deuxième question, cette même ligne de protection m'embête car elle engendre quelque chose de non désiré.

Ci-dessous, le code de mon formulaire d'envois d'image :


<!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" >
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<title>Envoyer une image</title>
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="templates/css/design.css" />
	</head>
	
<body>

	<div id="page">
		<div class="contenu">
		
			<fieldset>
				<legend>Envoyer une image</legend>
				
					<form action="cible_envoi.php" method="post" enctype="multipart/form-data">
					<p>
					Veuillez envoyer votre image en utilisant le formulaire ci-dessous.<br />
					<input type="file" name="monimage" /><br />
					<input type="submit" value="Envoyer votre image" />
					</p>
					</form>
					
			</fieldset>
	
		</div>
	</div>
					
</body>
</html>


Maintenant, le script traitant l'envoie de l'image :


<?php

/*	Script PHP permettant d'effectuer des verifications d'une image envoyée sur le serveur.
  *	Dernière date de modification : 13 aout 2009.
  *	Provenance : Script provenant du site du zéro.
*/

// Tout d'abord, on vérifie si l'image que l'internaute a envoyé a bien été envoyé et qu'il n'y a pas eu d'erreur.
if (isset($_FILES['monimage']) AND $_FILES['monimage']['error'] == 0)
{    
    // On vérifie que l'image n'excède pas 1mo.
	if ($_FILES['monimage']['size'] <= 1000000)
	{
	    // On vérifie si l'extension de l'image est autorisée.
		$infosimage = pathinfo($_FILES['monimage']['name']);
		$extension_upload = $infosimage['extension'];
		$extension_autorisees = array('jpg', 'jpeg', 'png');
		if (in_array($extension_upload, $extension_autorisees))
		{
		    // Si l'extension est bonne, on valide et on stocke définitivement l'image.
			move_uploaded_file($_FILES['monimage']['tmp_name'], 'uploads/' . basename($_FILES['monimage']['name']));
			echo "Votre image a bien été envoyé !";
		
		}
		else 
		{
			echo "L'extension de votre image n'est pas autorisée.";
		}
	}
	else
	{
		echo "Vous ne pouvez pas envoyer une image excédent 1mo.";
	}
}
else 
{
	echo "Une erreur s'est produite durant le transfert de votre image.";
}

?>


Bon, jusque-là tout marche comme voulu on ne peut pas envoyer une image excédent 1mo.
Si l'on essaie d'envoyer une image dont la taille est supérieure à 1mo, on verra Vous ne pouvez pas envoyer une image excédent 1mo. s'afficher.

Néanmoins, si, dans mon code XHTML, je rajoute cette ligne avec cette valeur :

<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />


Si, de nouveau, j'envoie une image excédent 1mo, une phrase nous dira ceci Une erreur s'est produite durant le transfert de votre image. et non Vous ne pouvez pas envoyer une image excédent 1mo.

J'ai essayé de modifier la valeur numérique de MAX_FILE_SIZE mais rien à y faire le problème persiste.

Alors que si je retire la ligne de protection de mon code XHTML la phrase Vous ne pouvez pas envoyer une image excédent 1mo. s'affiche bien.

D'où ma question, le responsable de cette erreur et la ligne de protection ou sa valeur ?
Modifié par jQz (14 Aug 2009 - 00:13)
Salut,

personnellement je ne me sers jamais de MAX_FILE_SIZE. Il serait pourtant bien utile s'il servait à vérifier côté client la taille d'un fichier avant de l'uploader mais d'après les tests que j'avais effectués (il y a déjà un moment donc ça a peut-être changé) il ne fait effectivement que générer un warning (donc à priori côté serveur).

Quoi qu'il en soit je trouve préférable d'indiquer clairement la taille maxi d'un fichier à uploader (dans le formulaire) et de faire les tests côté serveur.


Sinon je ne sais pas si c'est écrit comme ça sur le site du zéro (je t'avais dit déjà que leurs tutos n'étaient pas toujours très carrés ? Smiley langue ) mais 1Mo n'a jamais fait 1000000 octets : ça fait 1048576 !
Modifié par Heyoan (13 Aug 2009 - 23:02)
a écrit :
Quoi qu'il en soit je trouve préférable d'indiquer clairement la taille maxi d'un fichier à uploader (dans le formulaire) et de faire les tests côté serveur.


Moi aussi je pense que c'est plus judicieux.
A moins que d'autres personnes prouvent le contraire ?

a écrit :
Sinon je ne sais pas si c'est écrit comme ça sur le site du zéro (je t'avais dit déjà que leurs tutos n'étaient pas toujours très carrés ? Smiley langue ) mais 1Mo n'a jamais fait 1000000 octets : ça fait 1048576 !


Si si, tu me l'avais déjà dit Smiley lol , mais comme j'ai commencé à apprendre le PHP sur ce site, je pense finir tout les tutoriels avant de passer à un autre site ?

En même temps, quand dans le tutoriel, l'auteur nous dit :

a écrit :
On veut interdire que le fichier dépasse 1 Mo, soit environ 1 000 000 d'octets (j'arrondis pour simplifier). On doit donc tester $_FILES['monfichier']['size'] [...]


Oui, l'auteur nous dit qu'il a arrondi donc on ne peux pas savoir que cette valeur n'est pas exacte contrairement à celle que tu proposes.

Si tu veux voir le tutoriel que j'ai suivi pour le formulaire :

- L'envoi de fichier.
Il y a aussi un complément à lire :

- Upload de fichiers par formulaire.
J'ai entamé la lecture de ce dernier mais comme il aborde des sujets qui me sont encore inconnus, je préfère m'arrêter.

Sinon, encore merci à toi Heyoan, tu as (encore Smiley smile ) résolu mon problème.
Il fallait bien mettre 1048576 au lieu de 1000000.
Le complément est intéressant. Notamment parce qu'il montre bien l'association de LABEL for avec chaque INPUT.

Il contient également cette phrase :
a écrit :
Normalement, depuis quelques années, 1 Go = 1'000 Mo = 1'000'000 Ko = 10^9 octets, mais cette norme n'est pas suivie par tout le monde, il existe encore beaucoup de cas où le "vieux" système de conversion est utilisé
Je n'avais jamais entendu parler de ça et je ne l'ai vu utilisé nulle part mais wikipedia confirme.
a écrit :
Je n'avais jamais entendu parler de ça et je ne l'ai vu utilisé nulle part mais wikipedia confirme.


Comme quoi, certains tutoriels sont carrés Smiley langue .

Sinon, juste une petite question subsidiaire, après les Zio soit 1 208 925 819 614 629 174 706 176 octets il va quand même bien falloir s'arrêter, non Smiley sick X) ?
Modifié par jQz (14 Aug 2009 - 00:13)
jQz a écrit :
Comme quoi, certains tutoriels sont carrés
Je n'ai jamais dit que c'était systématique. Smiley cligne

D'ailleurs en regardant vite fait j'ai quand même vu 3/4 petites choses "pas carrées"... même si globalement je le trouve bien fichu.
Modifié par Heyoan (14 Aug 2009 - 00:31)
Salut,

jQz a écrit :
Si, de nouveau, j'envoie une image excédent 1mo, une phrase nous dira ceci Une erreur s'est produite durant le transfert de votre image. et non Vous ne pouvez pas envoyer une image excédent 1mo.

J'ai essayé de modifier la valeur numérique de MAX_FILE_SIZE mais rien à y faire le problème persiste.

Ce n'est pas vraiment un problème, vu ta première condition. Seulement quand le fichier dépasse la taille précisée dans ton champ MAX_FILE_SIZE, ça renvoie au serveur un code erreur (2). Ta vérification si error == 0 est donc fausse, et le script passe donc dans le else.
Tu aurais pu voir ce détail en faisant un var_dump( $_FILES ) (d'après les derniers tests que j'avais pu faire à l'époque ..).
Bonjour Agylus,

Pour être honnête, je n'ai pas compris ce que tu essayais de me faire comprendre avec la fonction var_dump().
J'ai fais quelques recherches sur php.net - var_dump mais je ne sais pas comment l'utiliser dans mon code.

Pourrais-tu me l'expliquer ?