Problème Upload image

Eléphant du PHP | 184 Messages

27 oct. 2011, 17:57

Bonjour à vous, je reviens vers vous concernant l'upload, j'ai finalement opté pour enregistrer le nom de l'image au lieu de l'url.

Mon soucis, c'est que l'enregistrement du titre, texte et nom de l'image se fait bien dans la bdd, mais je n'arrive pas à faire marcher mon upload.
Il me dit à chaque fois que l’extension de mon fichier est incorrecte.

Je dois avoir une erreur quelque part :(


<?php

require("connexion/conf.php");

$conn = mysql_connect($sql_serveur, $sql_user, $sql_passwd) or trigger_error(mysql_error(),E_USER_ERROR);

mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error()); 
 
mysql_select_db($sql_bdd, $conn); 

if(isset($_POST['action'])){
 
 // Récupération des variables nécessaires	
$titre_image = mysql_real_escape_string($_POST['titre_image']);
$texte_image = mysql_real_escape_string($_POST['texte_image']);
$url_image = mysql_real_escape_string($_POST['fichier']);

$sq="insert into images values('',\"$titre_image\",\"$texte_image\",\"$url_image\")"; 
$quer=mysql_query($sq ) or die('erreur sq: '.mysql_error());


define('TARGET', 'images/');
define('MAX_SIZE', 200000); 
define('WIDTH_MAX', 800);
define('HEIGHT_MAX', 800);

$tabExt = array('jpg','gif','png','jpeg'); 
$infosImg = array();

$extension = '';
$message = '';
$nomImage = '';

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 !'); 
}
}
if(!empty($_POST))
{ 
// On verifie si le champ est rempli 
if( !empty($_FILES['fichier']['name']) ) 
{
// Recuperation de l'extension du fichier 
$extension = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION); 
// On verifie l'extension du fichier 
if(in_array(strtolower($extension),$tabExt)) 
{ 
// On recupere les dimensions du fichier 
$infosImg = getimagesize($_FILES['fichier']['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['fichier']['tmp_name']) <= MAX_SIZE)) 

//on redimentionne limage
$x = 300; 

$y = 200; # Taille en pixel de l'image redimensionnée 

if ($infosImg)

echo 'Image redimensionnée ... 
'; 

if ($infosImg['mime']=='image/jpeg' ) { 
$img_big = imagecreatefromjpeg($_FILES['fichier']['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['fichier']['tmp_name'] ); 
}
elseif ($infosImg['mime']=='image/png' ) { 
$img_big = imagecreatefrompng($_FILES['fichier']['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['fichier']['tmp_name'] ); 
}
elseif ($infosImg['mime']=='image/gif' ) { 
$img_big = imagecreatefromgif($_FILES['fichier']['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['fichier']['tmp_name'] ); 
}
{ 
// Parcours du tableau d'erreurs 
if(isset($_FILES['fichier']['error']) 
&& UPLOAD_ERR_OK === $_FILES['fichier']['error']) 
{ 
// On renomme le fichier 
$nomImage = md5(uniqid()) .'.'. $extension; 
// Si c'est OK, on teste l'upload 
if(move_uploaded_file($_FILES['fichier']['tmp_name'], TARGET.$nomImage)) 
{ 
$message = 'Upload réussi !'; 
} 
else 
{ 
// Sinon on affiche une erreur systeme 
$message = 'Problème lors de l\'upload !'; 
} 
} 
else 
{ 
$message = 'Une erreur interne a empêché l\'uplaod de l\'image'; 
} 
}
} 
else 
{ 
// Sinon erreur sur les dimensions et taille de l'image 
$message = 'Erreur dans les dimensions de l\'image !'; 
} 
} 
else 
{ 
// Sinon erreur sur le type de l'image 
$message = 'Le fichier à uploader n\'est pas une image !'; 
} 
} 
else 
{ 
// Sinon on affiche une erreur pour l'extension 
$message = 'L\'extension du fichier est incorrecte !'; 
} 
} 
else 
{ 
// Sinon on affiche une erreur pour le champ vide 
$message = 'Veuillez remplir le formulaire svp !'; 
}
?><!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 un Client</title>

</head>

<body>

<center>

<?php if( !empty($message) ) { 

echo '<p>',"\n"; echo "\t\t<strong>", htmlspecialchars($message) ,"</strong>\n"; 
echo "\t</p>\n\n"; } ?> 

<?php

echo '<p style="color:#ff0000;font-weight:bold;">Entrée correctement ajouté à la base de données</p>'."<br><br><a href=\"addcategorie.php\">Ajouter un nouveau client</a>"."<br><br><a href=\"admin.php\">Revenir à l'accueil</a>";

}

else{
	
?>

<center>

<h1>Ajouter une catégorie:</h1>
<br />
	<form action="addimage.php" method="post">
	<input type="hidden" name="action" value="add">
	Ajouter le titre:<br><input type="text" name="titre_image"><br /><br />
    Ajouter le texte:<br><textarea name="texte_image"></textarea><br /><br />
    
    <fieldset><label for="fichier_a_uploader" title="Recherchez le   fichier à uploader !">Ajouter l'image:</label> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_SIZE; ?>" /> <input name="fichier" type="file" id="fichier_a_uploader" /></fieldset>
    <br>
    <br>
	<input type="submit" name="submit" value="Envoyer">
	</form>
	<br>
	<font face="Verdana" size="2"><a href="admin.php">Revenir à l'accueil</a></font>
    
</center>
    
<?php

}

?>
</center>
</body>

</html>



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

27 oct. 2011, 20:06

salut,

a tu fait un var_dump($extension);

si oui qu'est ce que ça donne ? c'est forcément le if(in_array()) qui déconne donc doit y avoir un soucis au niveau de l'extension :)

ps : j'a pas regardé si le message d'erreur était en double (copier coller quand tu nous tiens ;) )

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

Eléphant du PHP | 184 Messages

27 oct. 2011, 20:13

J'ai ça en rajoutant le var_dump:

string(0) ""

Mon upload marchait avant que je ne l'implante dans le add de ma bdd, je pense que cela doit être un problème de structure mais je n'arrive pas à voir où.

( Merci d'avoir pris la peine de regarder )

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

27 oct. 2011, 20:30

oula y a comme un soucis la ton utilisation de pathinfo est foireuse :/

pour le test vie la constante et fait un var_dump du tableau
$extension = pathinfo($_FILES['fichier']['name']);
var_dump($extension);

tu pourra voir ce que tu donne a manger à pathinfo ;)

un var_dump($_FILES); serait pas mal pour voir ce que donne l'upload sur le serveur !


edit : en fait j'suis mirro il te manque le enctype="multipart/data" pour active le dl du fichier tu doit passer une chaine vide à pathinfo.

Par contre ceci m'indique que tu ne code pas avec un niveau d'erreur adéquat à un développement, celui ci devrait être E_ALL |E_STRICT (pour php5). normalement ut devrais avoir des messages d'erreurs sur l'inexistance des index dans le tableau $_FILES

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

Eléphant du PHP | 184 Messages

27 oct. 2011, 20:41

Rien ne s'affiche je ne comprend pas :(

A quel endroit ils faut placer ces éléments ?

Eléphant du PHP | 184 Messages

27 oct. 2011, 20:45

Désolé je n'avais pas vu ton message précédant,

Effectivement, il me manquait cette partie importante !

Par contre maintenant, il ne m'enregistre plus le nom de l'image dans le champ :(

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

27 oct. 2011, 22:22

c'est quoi ton dernier code ?

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

Eléphant du PHP | 184 Messages

27 oct. 2011, 23:33

La même chose mais avec le enctype en plus:

	<form action="addimage.php" method="post" enctype="multipart/form-data">
	<input type="hidden" name="action" value="add">
	Ajouter le titre:<br><input type="text" name="titre_image"><br /><br />
    Ajouter le texte:<br><textarea name="texte_image"></textarea><br /><br />
    
    <fieldset><label for="fichier_a_uploader" title="Recherchez le   fichier à uploader !">Ajouter l'image:</label> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_SIZE; ?>" /> <input name="fichier" type="file" id="fichier_a_uploader" /></fieldset>
    <br>
    <br>
	<input type="submit" name="submit" value="Envoyer">
	</form>


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

28 oct. 2011, 11:04

bon j'étais en forme hier, dans le formulaire c'est enctype="multipart/form-data" ...... (enfin t'a corrigé tout seul :) )
Avec ça le script devrais être plus sympa

a tu bien compris la démarche de ton script ?

parce que la tu fait le redimensionnement de l'image avant l'upload "complet".

au final et déplace une image une image qui a été retravaillée et il ne s'agit plus d'un fichier uploadé donc, normalement move_uploaded_file doit retourner une erreur ou false à voir;

Pourquoi fait tu l'insertion dans la table images avant le traitement de l'image, avant même de savoir si un fichier est arrivé sur le serveur ?
au vu de la dtd que tu indique (<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) il serait bon de la respecter
pas <br> mais <br />
pas <input > mais <input />
<center> n'existe pas

un test rapide tout s'insère dans la table le répertoire image contient bien une image redimensionnée tous va bien :) (enfin le redimensionnement rend l'image illisible, je sais plus a quoi ressemble mon MCD :lol: ).

ah si une erreur quand même : $url_image = mysql_real_escape_string($_POST['fichier']);
Notice: Undefined index: fichier in C:\xampp\htdocs\test\trunck.php on line 15 <= normal c'est dans $_FILES pas $_POST :evil:

d'ailleurs tu ne devrais pas utiliser des variables ainsi sans vérifier leurs existences (a aucun moment tu ne peux être certain que le formulaire sera conforme a ce que tu souhaite !).

le code testé : (avec des commentaires en plus à lire :mrgreen: )
@+
<?php
//require("connexion/conf.php");
$sql_serveur = 'localhost';
$sql_user = 'root';
$sql_passwd = '';
$sql_bdd = 'test';
$conn = mysql_connect($sql_serveur, $sql_user, $sql_passwd) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error()); 
mysql_select_db($sql_bdd, $conn); 
if(isset($_POST['action'])){

      // Récupération des variables nécessaires   
    $titre_image = mysql_real_escape_string($_POST['titre_image']);
    $texte_image = mysql_real_escape_string($_POST['texte_image']);
    $url_image = mysql_real_escape_string($_POST['fichier']);

    $sq="insert into images values('',\"$titre_image\",\"$texte_image\",\"$url_image\")"; 
    $quer=mysql_query($sq ) or die('erreur sq: '.mysql_error());

    define('TARGET', 'images/');
    define('MAX_SIZE', 200000); 
    define('WIDTH_MAX', 800);
    define('HEIGHT_MAX', 800);

    $tabExt = array('jpg','gif','png','jpeg'); 
    $infosImg = array();

    $extension = '';
    $message = '';
    $nomImage = '';

    if( !is_dir(TARGET) ) {
        if( !mkdir(TARGET, 0755) ) { 
            // hum c'est un peu brutal ça même pas un affichage du site ^^
            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 !'); 
        }
    }
    if(!empty($_POST)){ // un peu bête si tu est ici c'est que $_POST['action'] existe don cpas vide ^^
        // On verifie si le champ est rempli 
        if( !empty($_FILES['fichier']['name']) ) {
            // Recuperation de l'extension du fichier 
            $extension = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION); 
            // On verifie l'extension du fichier 
            if(in_array(strtolower($extension),$tabExt)) { 
                // On recupere les dimensions du fichier 
                $infosImg = getimagesize($_FILES['fichier']['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['fichier']['tmp_name']) <= MAX_SIZE)) 
                    //on redimentionne limage
                        // manque pas des {} la pour x et y ?
                    $x = 300; 
                    $y = 200; # Taille en pixel de l'image redimensionnée 

                    if ($infosImg) echo 'Image redimensionnée ... '; 

                    if ($infosImg['mime']=='image/jpeg' ) { 
                        $img_big = imagecreatefromjpeg($_FILES['fichier']['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['fichier']['tmp_name'] ); 
                    }
                    elseif ($infosImg['mime']=='image/png' ) { 
                        $img_big = imagecreatefrompng($_FILES['fichier']['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['fichier']['tmp_name'] ); 
                    }
                    elseif ($infosImg['mime']=='image/gif' ) { 
                        $img_big = imagecreatefromgif($_FILES['fichier']['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['fichier']['tmp_name'] ); 
                    }
                    // la y manque un truc hein !!!!
                    { 
                        // Parcours du tableau d'erreurs 
                        if(isset($_FILES['fichier']['error']) 
                            && UPLOAD_ERR_OK === $_FILES['fichier']['error']) { 
                            // On renomme le fichier 
                            $nomImage = md5(uniqid()) .'.'. $extension; 
                            // Si c'est OK, on teste l'upload 
                            if(move_uploaded_file($_FILES['fichier']['tmp_name'], TARGET.$nomImage)) { 
                                $message = 'Upload réussi !'.__LINE__; 
                            } 
                            else { 
                                // Sinon on affiche une erreur systeme 
                                $message = 'Problème lors de l\'upload !'.__LINE__; 
                            } 
                        } 
                        else { 
                        $message = 'Une erreur interne a empêché l\'uplaod de l\'image'.__LINE__; 
                        } 
                    }
                }  
                else { 
                    // Sinon erreur sur les dimensions et taille de l'image 
                    $message = 'Erreur dans les dimensions de l\'image !'.__LINE__; 
                } 
            } 
            else { 
                // Sinon erreur sur le type de l'image 
                $message = 'Le fichier à uploader n\'est pas une image !'.__LINE__; 
            } 
        } 
        else { 
            var_dump($_FILES);
            // Sinon on affiche une erreur pour l'extension 
            $message = 'L\'extension du fichier est incorrecte !'.__LINE__;  // <= ça c'est pas bon comme message c'est pas l'extension mais la validation de l'envoi ^^
        } 
        }
    else { 
    // Sinon on affiche une erreur pour le champ vide 
        $message = 'Veuillez remplir le formulaire svp !'; 
    }
    ?>
    <!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 un Client</title>
     </head>
     <body>
     <center><!-- ça n'existe pas dans le doctype indiqué => div + css -->
    <?php
    if( !empty($message) ) { 
        echo '<p>',"\n"; echo "\t\t<strong>", htmlspecialchars($message) ,"</strong>\n"; 
        echo "\t</p>\n\n"; 
    } 
    echo '<p style="color:#ff0000;font-weight:bold;">Entrée correctement ajouté à la base de données</p>'."<br><br><a href=\"addcategorie.php\">Ajouter un nouveau client</a>"."<br><br><a href=\"admin.php\">Revenir à l'accueil</a>";
}
else{       
?>
 <center><!-- pourquoi un deuxième ? -->
 <h1>Ajouter une catégorie:</h1>
 <br />
         <form action="" method="post" enctype="multipart/form-data"><!-- si c'est sur la même page pas obligé de mettre le nom mais je crois que la dtd l'impose
             addimage.php -->
             <input type="hidden" name="action" value="add" />
             <!-- un input doit être terminé par un / <input machin /> -->
            Ajouter le titre:<br /><input type="text" name="titre_image"><br /><br />
            Ajouter le texte:<br /><textarea name="texte_image"></textarea><br /><br />
            <fieldset>
                <label for="fichier_a_uploader" title="Recherchez le   fichier à uploader !">Ajouter l'image:</label> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_SIZE; ?>" />
                <input name="fichier" type="file" id="fichier_a_uploader" />
            </fieldset>
             <br />
             <br />
             <input type="submit" name="submit" value="Envoyer" /></input>
        </form>
         <br /> <!-- attention c'est <br /> et pas <br> -->
         <!-- existe pas dans la dtd choisie -->
         <font face="Verdana" size="2"><a href="admin.php">Revenir à l'accueil</a></font>
 </center> 
<?php
}
?>
 </center>
 </body>
 </html>
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

28 oct. 2011, 18:50

Merci à toi, tu es un grand guerrier Jedi :)

Je vais lire attentivement cette correction et apprendre de mes erreurs.

Par contre je ne savais pas que la balise <center> n'existait pas :(
Je m'en sert pour centrer ( lol ) des blocs, apparemment il va falloir que je m'en passe :)

Par contre j'ai du faire une bêtise, j'ai remplacé l'erreur 15 par ça:

$url_image = $_FILES['fichier'];

Mais il me met toujours "array" dans le champ du tableau lol