Problème function imagecreate / Upload d'image

Eléphanteau du PHP | 17 Messages

22 févr. 2012, 09:30

Bonjour,

J'utilise un formulaire avec upload d'image et redimensionnement. Si j'upload une image plus petite que 800 sur 800px (Taille maximale dans le script), ça marche correctement (L'image est uploadée et redimmensionnée). Par contre, si l'image est plus grande, elle n'est pas redimmensionnée, mais est quand même envoyée dans le dossier image, et j'ai cette erreur :

Warning: imagecreate() [function.imagecreate]: Invalid image dimensions in /home/...../sign_up.php on line 129

Code : Tout sélectionner

// On verifie si l'image est dans les dimensions if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['image']['tmp_name']) <= MAX_SIZE)) //on redimentionne limage $x = 75; $y = 75; # Taille en pixel de l'image redimensionnée if ($infosImg) echo 'Image redimensionnée ... '; if ($infosImg['mime']=='image/jpeg' ) { $img_big = imagecreatefromjpeg($_FILES['image']['tmp_name']); # On ouvre l'image d'origine $img_new = imagecreate($x, $y); ////////////////////////////////////////////////////////Ligne 129 # création de la miniature $img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y); .................................. // On renomme le fichier $nomImage = md5(uniqid()) .'.'. $extension; // Si c'est OK, on teste l'upload if(move_uploaded_file($_FILES['image']['tmp_name'], TARGET.$nomImage)) { $message = 'Upload réussi !'; } else { // Sinon on affiche une erreur systeme $message = 'Problème lors de l\'upload !'; }
Je crois que le problème est ici :

Code : Tout sélectionner

if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['image']['tmp_name']) <= MAX_SIZE))
Le script vérifie si l'image est inférieure à WIDTH_MAX, HEIGHT_MAX et MAX_SIZE mais pas si elle est supérieure, ce qui cause l'erreur.
Je peux faire ça pour vérifier le poids de l'image :

Code : Tout sélectionner

if (filesize($_FILES['avatar']['tmp_name']) > MAX_SIZE)
Mais je ne sais pas où le placer pour qu'il déclenche un message d'erreur et annule l'inscription.

Eléphant du PHP | 179 Messages

22 févr. 2012, 10:40

je pense que ton problème vient bien de ce IF, mais il est que tu ne lui as pas mis d'acolade, donc seul l'instruction suivante du IF sera comptabilisé pour lui :
celle ci : $x = 75;
Donc si l'image n'est pas à la taille ton $x ne sera pas définit, d'ou l'erreur.

Eléphanteau du PHP | 17 Messages

22 févr. 2012, 23:52

Je ne pense pas que l'acolade soit nécessaire.

Il faudrait que je donne l'ordre d'un message d'erreur si l'image est trop lourde ou trop grande. Par exemple :

if (($infosImg[0] > WIDTH_MAX) && ($infosImg[1] > HEIGHT_MAX) && (filesize($_FILES['avatar']['tmp_name']) > MAX_SIZE)) $erreur = "Image trop grande";

Mais ça ne marche pas

ViPHP
ViPHP | 2287 Messages

23 févr. 2012, 00:14

@forumeur : essaye quand même de rajouter l'accolade, car l'explication de Thibaud C tient la route et expliquerait parfaitement ton erreur :
-> le if() sans accolade de bloc qui s'applique donc à l'instruction suivante, $x=75;
-> $x est donc indéfini (==0)
-> imagecreate qui se plaint des dimensions fournies (ce qui n'arrive que quand on lui fournit des dimensions erronées, par exemple 0)

Tu pourras par la suite gérer un message d'erreur dans un bloc else à la suite du if().
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphanteau du PHP | 17 Messages

23 févr. 2012, 00:36

J'ai rajouté l'accolade :

Code : Tout sélectionner

// On verifie si l'image est dans les dimensions if (($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['image']['tmp_name']) <= MAX_SIZE)) { // Nouvelle accolade //on redimentionne limage $x = 75; $y = 75; # Taille en pixel de l'image redimensionnée if ($infosImg) echo 'Image redimensionnée ... '; if ($infosImg['mime']=='image/jpeg' ) { $img_big = imagecreatefromjpeg($_FILES['image']['tmp_name']); # On ouvre l'image d'origine $img_new = imagecreate($x, $y); # création de la miniature $img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y); // copie de l'image, avec le redimensionnement. imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$infosImg[0],$infosImg[1]); imagejpeg($img_mini,$_FILES[''image']['tmp_name'] ); } elseif ($infosImg['mime']=='image/png' ) { $img_big = imagecreatefrompng($_FILES[''image']['tmp_name']); # On ouvre l'image d'origine $img_new = imagecreate($x, $y); # création de la miniature $img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y); // copie de l'image, avec le redimensionnement. imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$infosImg[0],$infosImg[1]); imagepng($img_mini,$_FILES[''image']['tmp_name'] ); } elseif ($infosImg['mime']=='image/gif' ) { $img_big = imagecreatefromgif($_FILES[''image']['tmp_name']); # On ouvre l'image d'origine $img_new = imagecreate($x, $y); # création de la miniature $img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y); // copie de l'image, avec le redimensionnement. imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$infosImg[0],$infosImg[1]); imagegif($img_mini,$_FILES['image'']['tmp_name'] ); } } // Fermeture de l'accolade
Mais le message d'erreur est toujours là. Le problème, c'est que bien que l'image soit trop grande ou trop lourde, le formulaire est enregistrée et l'image est uploadée dans le dossier cible.

ViPHP
AB
ViPHP | 5818 Messages

23 févr. 2012, 00:54

Ben c'est que ta condition ne fonctionne pas correctement...

Vérifie la valeur de tes variables et des constantes qui sont dans ta condition avec var_dump, ex :
var_dump($infosImg[0]);
//etc.

Eléphanteau du PHP | 17 Messages

23 févr. 2012, 10:20

Avec un var_dump, je me suis aperçu que la variable $infosimg était vide.

Maintenant, ça fonctionne correctement. Je laisse la partie de code modifiée si ça peut en aider d'autres :

Code : Tout sélectionner

// On recupere les dimensions du fichier @$infosImg = getimagesize($_FILES['image']['tmp_name']); // Le @ pour cacher l'erreur SQL si l'image est trop lourde if (empty($infosImg)) echo '<div class="message">Votre image est trop lourde. Vous pourrez la changer dans votre profil<br /></div>'; else echo '<div class="message">Votre image a bien été chargée<br /></div>'; // On verifie le type de l'image if($infosImg[2] >= 1 && $infosImg[2] <= 14) { // On verifie si l'image est dans les dimensions if (($infosImg[0] <= WIDTH_MAX or $infosImg[0] > WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX or $infosImg[1] > HEIGHT_MAX) && (filesize($_FILES['avatar']['tmp_name']) <= MAX_SIZE)) // Si l'image fait plus de 150 pixels, elle sera redimmensionnée //on redimensionne limage $x = 150; $y = 150; # Taille en pixel de l'image redimensionnée
Merci

Maxo
Invité n'ayant pas de compte PHPfrance

23 févr. 2012, 13:52

Bonjour,

j'ai un probleme dans le meme genre, par contre c'est l'upload qui ne marche pas très bien.
je post une variable TARGETID qui contient le répertoire à créer et ensuite je veux uploader l'image dans ce dossier.
le probleme c'est que j'ai constaté que var_dump($_FILES) est null malgré qu'il fait bien l'upload à la fin sauf qu'il le fait dans la racine dans le répertoire est créée mais reste vide.

je poste la variable en ajax.

quelqu'un peut m'aider !!
<?php

/************************************************************
 * Resize Image                                             *
 ***********************************************************/
function resizeImg($x,$y,$size,$file)
{
    if ($size)
    {
        if ($size['mime']=='image/jpeg' )
        {
            $img_big = imagecreatefromjpeg($file); # On ouvre l'image d'origine 
            $img_new = imagecreate($x, $y); 
            # création de la miniature 
            $img_mini = imagecreatetruecolor($x, $y)
            or   $img_mini = imagecreate($x, $y);

            // copie de l'image, avec le redimensionnement. 
            imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]); 

            imagejpeg($img_mini,$file );
        }elseif ($size['mime']=='image/png') 
        {
            $img_big = imagecreatefrompng($file); # On ouvre l'image d'origine 
            $img_new = imagecreate($x, $y); 
            # création de la miniature 
            $img_mini = imagecreatetruecolor($x, $y) 
            or   $img_mini = imagecreate($x, $y); 

            // copie de l'image, avec le redimensionnement. 
            imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
            imagepng($img_mini,$file );
        }elseif ($size['mime']=='image/gif') 
        {
                $img_big = imagecreatefromgif($file); # On ouvre l'image d'origine 
                $img_new = imagecreate($x, $y); 
                # création de la miniature 
                $img_mini = imagecreatetruecolor($x, $y) 
                or   $img_mini = imagecreate($x, $y); 

                // copie de l'image, avec le redimensionnement. 
                imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]); 
                imagegif($img_mini,$file ); 
        }
    }
}

/************************************************************
 * Recuperation des variables + Constantes                  *
 ***********************************************************/

//if(isset ($_POST['TargetID']) && $_POST['TargetID'] != "")
//{
    $iId = $_POST['TargetID'];
    define('TARGET', '../Annonces/'.$iId);    // Repertoire cible
    define('MAX_SIZE', 10000000);    // Taille max en octets du ImgFile
    define('WIDTH_MAX', 80000);    // Largeur max de l'image en pixels
    define('HEIGHT_MAX', 80000);    // Hauteur max de l'image en pixels    
//}  else {
//    $message = 'Internal Error When Uploading';
//}
// Tableaux de donnees
$tabExt = array('jpg','gif','png','jpeg');// Extensions autorisees
$infosImg = array();

// Variables
$extension = '';
$message = '';
$ImgName = '';
$iCounter = 0;

/************************************************************
 * Creation du repertoire cible si inexistant               *
 ***********************************************************/
if( !is_dir(TARGET) ) 
{
    if( !mkdir(TARGET, 0755) )
    {
        exit('Erreur : le répertoire cible ne peut-être créé ! Vérifiez que vous diposiez des droits suffisants pour le faire ou créez le manuellement !');
    }
}

/************************************************************
 * Script d'upload                                          *
 ************************************************************/

try
{
    // On verifie si le champ est rempli
    if(isset($_FILES['ImgFile']['name']))
    {
        // Recuperation de l'extension du ImgFile
        $extension  = pathinfo($_FILES['ImgFile']['name'], PATHINFO_EXTENSION);

        // On verifie l'extension du ImgFile
        if(in_array(strtolower($extension),$tabExt))
        {
          // On recupere les dimensions du ImgFile
          $infosImg = getimagesize($_FILES['ImgFile']['tmp_name']);

          // On verifie le type de l'image
          if($infosImg[2] >= 1 && $infosImg[2] <= 14)
          {
            // On verifie les dimensions et taille de l'image
            if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['ImgFile']['tmp_name']) <= MAX_SIZE))
            {
              // Parcours du tableau d'erreurs
              if(isset($_FILES['ImgFile']['error']) && UPLOAD_ERR_OK === $_FILES['ImgFile']['error'])
              {
                // On renomme le ImgFile
                $iId = "1234988";
                $ImgName = $iId.'.'. $extension;
                $Count = '123456.'. $extension;
                $uploadfile = TARGET."/".$ImgName;

                if (is_dir(TARGET))
                {
                    $folder = opendir(TARGET);
                    {
                        // Ceci est la façon correcte de traverser un dossier. 
                        while (false !== ($file = readdir($folder)))
                        {
                            if ($file != "." && $file != "..")
                            {
                                $iCounter++;
                            }
                        }
//                        if($iCounter < 5)
//                        {
                            // Si c'est OK, on teste l'upload
                            if(move_uploaded_file($_FILES['ImgFile']['tmp_name'], $uploadfile))
                            {
                              $message = 'Uploaded Succefully !';
                            }
                            else
                            {
                              // Sinon on affiche une erreur systeme
                              $message = 'Error When Uploading !';
                            }
//                        }
                        closedir($folder);
                    }
                }

                    $file = $uploadfile ; # L'emplacement de l'image à redimensionner. L'image peut être de type jpeg, gif ou png
                    $size = getimagesize($file);

                    $x = $size[0];
                    $y = $size[1]; # Taille en pixel de l'image redimensionnée 
                    $Ratio = $x/$y;

                    if ($y > 298)
                    {
                        $y = 298;
                        $x = $y * $Ratio;
                        resizeImg($x, $y, $size,$file);
                    }else if($x > 550)
                    {
                        $x = 550;
                        $y = $x / $Ratio;
                        resizeImg($x, $y, $size,$file);
                    }
              }
              else
              {
                $message = 'Internal Error When Uploading';
              }
            }
            else
            {
              // Sinon erreur sur les dimensions et taille de l'image
              $message = 'Error in the image dimensions !';
            }
          }
          else
          {
            // Sinon erreur sur le type de l'image
            $message = 'The uploaded file is not an image !';
          }
        }
        else
        {
          // Sinon on affiche une erreur pour l'extension
          $message = 'The extension of the image is not supported !';
        }
    }
    else
    {
    // Sinon on affiche une erreur pour le champ vide
    $message = 'Please fill the form !';
    }
}
 catch (Exception $ex)
 {
    echo $ex->getMessage();
 }
// echo $iCounter;
?>

ViPHP
AB
ViPHP | 5818 Messages

23 févr. 2012, 22:50

Si $_FILES est vide c'est probablement que l'image est trop lourde et dépasse la valeur serveur post_max_size. Et dans ce cas $_POST sera également vide.

Il y a un tuto ici pour entre autre pouvoir intercepter cette erreur.

Il y a normalement d'autres vérifications à faire, notamment que ton serveur alloue suffisamment de mémoire à ton script pour faire le redimensionnement. Tu peux regarder cette classe pour une gestion complète des erreurs et d'autres fonctionnalités.