Problème vérification taille image

Eléphant du PHP | 184 Messages

16 nov. 2011, 14:24

Bonjour à vous,

J'essaye de faire une vérification de fichier et de taille sur un formulaire d'upload d'images.
J'ai suivi un tuto, mais la vérification de la taille ne fonctionne pas.
La vérification sur l'extention oui par contre :(

J'en suis là:
        define('FILE_EXTENSION_PHOTO', '.jpg, .png, .gif');
	$taille_ko = 1024;
	$taille_max = $taille_ko*1024;
// ----------------------------------
// SI LE FORMULAIRE est posté : traitement
// ----------------------------------
if(isset($_POST['action'])){

	// -------------
	// Récupération des textes associés   
	$MAX_FILE_SIZE	= intval($_POST['MAX_FILE_SIZE']);
   // -------------
  // SI on a bien une photo uploadée :
  if(isset($_FILES['userfile']) && $_FILES['userfile']['size']>0)
  {
	// -------------------------------------
	// 1/ GESTION DES ERREURS de la photo
	// -------------------------------------
	// extension du fichier uploadé (en minuscule)
	$file_Extension 	= strtolower(pathinfo($_FILES['userfile']['name'],PATHINFO_EXTENSION));
	// -----------------
	// on vérifie le poids de l'image
        if(filesize($_FILES['userfile']['tmp_name']) > $taille_max)
        {
            $msgErreurPhoto .= "Votre fichier doit faire moins de $taille_ko Ko !";
            $traiterPhotoOK = 'NON';
		}
	// on verifie l extension
	elseif ($_FILES['userfile']['size']>0 && @strpos(FILE_EXTENSION_PHOTO,$file_Extension)===false) {
		$msgErreurPhoto .= 'Erreur <b>Photo</b> : Ce n\'est pas un fichier valide ('.FILE_EXTENSION_PHOTO.')<br />';
		$traiterPhotoOK = 'NON';
	}
	elseif ($traiterPhotoOK=='NON' && $msgErreurPhoto!='') {
		$msgErreurPhoto .= 'Impossible d\'enregistrer le fichier.';
	}
		else {
	$traiterPhotoOK ='OK';
	
	}
J'ai bien le message d'erreur quand l'extention n'est pas bonne, mais pas sur la taille.
Par contre il ne le fait pas :(
Juste il ne se passe rien quand je clique sur valider et que la taille est trop grande.

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

16 nov. 2011, 14:32

salut,

on va faire simple

=> l'utilisation de la recherche d'extension c'est plus que moyen, utilise un tableau + in_array

pour la taille pourquoi ne continu tu pas à utiliser $_FILES['userfile']['size'] ?

a tu essayé de les afficher ? (var_dump($_FILES['userfile']['size']); , echo filesize($_FILES['userfile']['tmp_name']); par exemple)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

16 nov. 2011, 14:44

J'ai ceci quand l'image est trop grande:

Warning: filesize() [function.filesize]: stat failed for 0

Et quand elle passe:

Warning: filesize() [function.filesize]: stat failed for 79308

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

16 nov. 2011, 16:10

le var_dump() ?
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

16 nov. 2011, 19:31

Oui :(

Je vous donne ce que j'ai fais, en gros, il me saute la vérification de la taille de l'image.
Si jamais l'image est plus grosse, il m'affiche le message d'erreur disant qu'il n'y a pas d'image.
Je crois qu'il y a des erreurs dans les if et les else mais je suis un peu paumé :(
( Je referais la vérification des formats, j'aimerai vraiment savoir pourquoi je n'arrive pas à contrôler la taille :( )

if(isset($_POST['action'])){

	// -------------
	// Récupération des textes associés   
	$MAX_FILE_SIZE	= intval($_POST['MAX_FILE_SIZE']);
   // -------------
  // SI on a bien une photo uploadée :
  if(isset($_FILES['userfile']) && $_FILES['userfile']['size']>0)
  {
	// -------------------------------------
	// 1/ GESTION DES ERREURS de la photo
	// -------------------------------------
	// extension du fichier uploadé (en minuscule)
	$file_Extension 	= strtolower(pathinfo($_FILES['userfile']['name'],PATHINFO_EXTENSION));
	// -----------------
	// on verifie les restrictions sur les fichiers
	if (filesize($_FILES['userfile']['size']) > 2097152) {
		$msgErreurPhoto .= 'Erreur <b>Photo</b> : Taille de fichier trop important (2 Mo Maximum)<br />';
		$traiterPhotoOK = 'NON';
	}
	// on verifie l extension
	elseif ($_FILES['userfile']['size']>0 && @strpos(FILE_EXTENSION_PHOTO,$file_Extension)===false) {
		$msgErreurPhoto .= 'Erreur <b>Photo</b> : Ce n\'est pas un fichier valide ('.FILE_EXTENSION_PHOTO.')<br />';
		$traiterPhotoOK = 'NON';

	}
	elseif ($traiterPhotoOK=='NON' && $msgErreurPhoto!='') {
		$msgErreurPhoto .= 'Impossible d\'enregistrer le fichier.';
	}
		else {
	$traiterPhotoOK ='OK';
	
	}
		
	// -------------------------------------
	// 2/ si pas d'erreur : TRAITEMENT
	// -------------------------------------
	if ($traiterPhotoOK=='OK')
	{
		// -------------
		// dossiers
		$uploaddir 		= $_SERVER['DOCUMENT_ROOT']."admin/bibliographie/images/";
		$uploaddir2 	= $_SERVER['DOCUMENT_ROOT']."admin/bibliographie/images/mini/";
		// -------------
	// nom de la photo
		$nFile			= htmlspecialchars(stripslashes(trim($_FILES['userfile']['name'])), ENT_NOQUOTES, 'UTF-8');
		// remplacement (caracteres accentués, espace)
		$avec_accent 	= utf8_decode("ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÒÓÔÕÖŒØÙÚÛÜÝàáâãäåæçèéêëìíîïðòóôõöùúûüýÿÑñŠšœ '²|',;:!¿/(){}[]+=*~<>&¢€£\$¤¥§©ø÷×µ¶®°±¨@#");
		$sans_accent 	= utf8_decode("abcdefghijklmnopqrstuvwxyzAAAAAAACEEEEIIIIOOOOOOOUUUUYaaaaaaaceeeeiiiioooooouuuuyynnsso--------------------------------------------");
		$nFile			= strtr(utf8_decode($nFile), $avec_accent, $sans_accent);
		$nFile			= utf8_encode($nFile);
		$nFile			= mysql_real_escape_string($nFile); // (pour enregistrement en Bdd)
		
		// -------------
		// on enregistre la photo originale
		move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$nFile);
		// -------------
		// on COPIE la photo originale (pour le picto, avant redimensionnement)
		$redimPHOTOOK800 = fctredimimage(800, 0, '', '', $uploaddir, ''.$nFile);
		copy($uploaddir.$nFile, $uploaddir2.$nFile);
		// redimensionnement/enregistrement du picto
		$redimPHOTOOK150 = fctredimimage(200, 0, '', '', $uploaddir2, ''.$nFile);
		// -------------
		$sq = "INSERT INTO images_bibliographie VALUES(''images/$nFile','images/mini/$nFile')"; 
		$quer = mysql_query($sq) or die('erreur sq: '.mysql_error());
		// -------------
		// message de validation
		$msgvalidPhoto 	= 'La photo a été uploadée';
	} // fin TRAITEMENT Photo
  }
  else{ 
  
$traiterPhotoOK ='NON'; 
 
echo '<center>'.'<br/>'.'<p style="color:#ff0000;font-weight:bold;">Vous devez charger une image pour pouvoir continuer</p>'.'</center>';
  }
} // fin traitement
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Ajouter une image</title>

<link href="../style.css" rel="stylesheet" type="text/css"/>

</head>

<body>

<center>
 
<?php
// ---------------------------------
// Traitement OK : message de validation
// ---------------------------------
if($traiterPhotoOK=='OK') 
{
	
echo '<br/>'.'<p style="color:#ff0000;font-weight:bold;">Image correctement ajoutée à la base de données</p>'."<br/><br/><a href=\"addimage.php\">Ajouter une nouvelle image</a>"."<br/><br/><a href=\"gestion_images.php\">Revenir à l'accueil</a>";
exit;
}
// ---------------------------------
// Affichage du FORMULAIRE
// ---------------------------------
elseif($traiterPhotoOK=='NON') 
echo $msgErreurPhoto;
{
?>

		<h1>Ajouter une image:</h1>
		<br /> 
	    <form action="addimage.php" method="post" enctype="multipart/form-data">
		<input type="hidden" name="action" value="add" />
		<input type="hidden" name="MAX_FILE_SIZE" value="5242880" />
 
		<p>Image:<br /><input type="file" name="userfile" /></p>
       
        <br />
		<p><input type="submit" name="submit" value="Envoyer" /></p>
	</form>
    
<?php
} // fin formulaire
?>

Eléphant du PHP | 184 Messages

17 nov. 2011, 11:38

Résolu apparemment :(

C'était le filesize qui faisait merder.

En l'enlevant:

if (filesize($_FILES['userfile']['tmp_name']) > 2097152)

Cela marche nickel.
Il y a moyen du coup de faire la comparaison avec la taille max du php.ini pour afficher aussi un message d'erreur au lieu qu'il ne fasse rien ?

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

19 nov. 2011, 14:43

Regarde dans la doc de php la gestion des erreurs, si tu dépasse la taille max, c'est indiqué dans le champ error de $_FILES['fichier'].

j'ai fait un quelque chose ici relatant la chose (liste non exhaustive).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

19 nov. 2011, 16:17

Merci pour ce lien :)