PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 11-10-2010 10:43:23

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Pb upload d'une image

Bonjour,
mon code pour uploader une image ne fonctionne pas. Je n'arrive pas a comprendre mon erreur. Le principe : j'uploade une image via un formulaire, le fichier est déplacé dans un répertoire, j'insère le lien correspondant dans une table.
Quand je teste, rien ne se passe : l'image n'est pas uploadée, le lien n'est pas inséré.

La fonction (dans un fichier fonctions.php appelé par la page) :

<?php
function addactus()
{

$date = date('d/m/Y');
$datecreation = "$date";
$texteFR = str_replace("\r\n","<br />",$_POST['texteFR']);
$texteEN = str_replace("\r\n","<br />",$_POST['texteEN']);
$altimageFR = $_POST['altimageFR'];
$altimageEN = $_POST['altimageEN'];

if (isset($_FILES['image']))
{
unset($erreur);

$taille_max = 20000000; // taille limitée à 20 Mo
$dest_dossier = '/images/actualites/'; // realpath du dossier de l'image

if (($_FILES['image']['type'] != 'image/png') || ($_FILES['image']['type'] != 'image/x-png') || ($_FILES['image']['type'] != 'image/jpeg') || ($_FILES['image']['type'] != 'image/jpg') || ($_FILES['image']['type'] != 'image/pjpg') || ($_FILES['image']['type'] != 'image/pjpeg'))
{
$erreur = "<span class='warning'>Veuillez sélectionner un fichier de type jpeg ou png !</span>";
}
elseif ($_FILES['image']['type'] == 'image/bmp')
{
$erreur = "<span class='warning'>Le format bitmap (.bmp) n&apos;est pas accepté. Convertissez votre image en jpg ou en png avant de l&apos;envoyer, merci.</span>";
}
elseif ($_FILES['image']['size'] > $taille_max)
{
$erreur = "<span class='warning'>L&apos;image doit avoir un poids inférieur à 20 Mo !</span>";
}
elseif(!@getimagesize($_FILES['image']['tmp_name']))
{
$erreur = "<span class='warning'>Vous avez tenté d&apos;envoyer un fichier qui n&apos;est pas une image !</span>";
}

if(!isset($erreur))
{
$dest_fichier = basename($_FILES['image']['name']);
$dest_fichier = strtr($dest_fichier,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
$dest_fichier = strtolower($dest_fichier);
// copie du fichier
move_uploaded_file($_FILES['image']['tmp_name'], $dest_dossier . $dest_fichier);
$lienimage = "images/actualites/$dest_fichier";
}

// Resize
$imgaredim="/images/actualites/".$dest_fichier; // realpath du dossier de l'image

$img_size = getimagesize($imgaredim);
$W_Src = $img_size[0];
$H_Src = $img_size[1];

$W_max = 150;

$W = $W_max;
$H = $W * ($H_Src / $W_Src);        

$size = getimagesize($imgaredim);

if (($size['mime']=='image/jpeg') || ($size['mime']=='image/jpg') || ($size['mime']=='image/pjpg') || ($size['mime']=='image/pjpeg')) {
$img_big = imagecreatefromjpeg($imgaredim);
$img_new = imagecreate($W, $H);
$img_mini = imagecreatetruecolor($W, $H);

imagecopyresized($img_mini,$img_big,0,0,0,0,$W,$H,$size[0],$size[1]);
imagejpeg($img_mini,$imgaredim);
}

elseif (($size['mime']=='image/png') || ($size['mime']=='image/x-png')) {
$img_big = imagecreatefrompng($imgaredim);
$img_new = imagecreate($W, $H);
$img_mini = imagecreatetruecolor($W, $H)
or   $img_mini = imagecreate($W, $H);

imagecopyresized($img_mini,$img_big,0,0,0,0,$W,$H,$size[0],$size[1]);
imagepng($img_mini,$imgaredim);
}

}
else  { $lienimage = ""; }

require "cfg_config.php";
$db = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die ("Impossible de se connecter : " . mysql_error());
mysql_select_db($cfgBase,$db);
   
$query = "INSERT INTO actualites (texteFR,texteEN,lienimage,altimageFR,altimageEN,datecreation,statut) VALUES('$texteFR','$texteEN','$lienimage','$altimageFR','$altimageEN','$datecreation','1')";
mysql_query($query) or die('Erreur SQL !<br />'.$query.'<br />'.mysql_error());

echo "<span class='success'>Votre actualité a été publiée avec succès.</span>";

mysql_close($db);
return (0);
}
?>

et le formulaire :

<html>
<form action="manage-news.php?phpsessid=<?php session_id(); ?>" method="post" enctype="multipart/form-data" name="addactu" id="addactu">
    <input type="hidden" value="1" name="ojsaddactu" />
      <br />
      <label for="image">     Image (format .jpg ou .png)</label>
      <input type="file" name="image" id="image" size="66" />
      <br />
      <?php echo $erreur; ?>
      <br />
      <img src="../images/flagFR.png" alt="FR" border="0" style="float:left;" /><label for="altimageFR">Description de l'image FR</label>
      <input type="text" name="altimageFR" id="altimageFR" size="50" />
      <br />
      <br />
      <img src="../images/flagEN.png" alt="EN" border="0" style="float:left;" /><label for="altimageEN">Description de l'image EN</label>
      <input type="text" name="altimageEN" id="altimageEN" size="50" />
      <br />
      <br />
      <br />
      <img src="../images/flagFR.png" alt="FR" border="0" style="float:left;" /><label for="texteFR">Texte FR</label>
      <textarea name="texteFR" id="texteFR" cols="60" rows="5"></textarea>
      <br />
      <br />
      <img src="../images/flagEN.png" alt="EN" border="0" style="float:left;" /><label for="texteEN">Texte EN</label>
      <textarea name="texteEN" id="texteEN" cols="60" rows="5"></textarea>
      <br />
      <br />
      <input name="submit" type="submit" value="Ajouter cette actualité" />
    </form>
</html>

Merci de vos lumières !

Hors ligne

#2 11-10-2010 11:04:17

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Pb upload d'une image

salut,

pour commencer tu présume de la présence des infos dans le tableaus $_POST ce qui n'est pas bon. tu ne peut savoir si si $_POST['texteFR'] existe qu'avec isset (le client peut très bien modifier la page html, c'est un manière simple d'obtenir des infos) !

ligne 14 unet($erreur); où à tu créer cette variable dans la fonction ? (elle n'existe pas donc unset est inutile, un message d'erreur peut etre si ton error_reporting = E_ALL ?)

!@getimagesize($_FILES['image']['tmp_name'])) pas super utile ça, test plutot les type mime (a ba oui tu le fait deja wink ).

pour ton soucis, à tu un message d'erreur ?
connais tu le système de fichier unix ?
quand tu écris $dest_dossier = '/images/actualites/'; // realpath du dossier de l'image
je suis certain que ce chemin n'existe pas. Alors tu ajoute un point devant le 1er / et tu utilise le chemin relatif ou tu trouve réellement le "realpath" comme tu l'indique (par exemple avec la fonction realpath.

quand a l'insertion dans la base, a priori y pas de raison que cela n'arrive pas, sauf si les variables n'existe pas au quel cas tu aura une erreur php (si ton error_reporting=E_ALL).

a tu des message d'affiché dans le source html de ta page ?
comment utilise tu cette fonction ?

utilise var_dump pour voir ce que contiennnent les super globale (var_dump($_FILES) par exemple.

histoire de voir ou ça peut clocher !

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#3 11-10-2010 11:12:39

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

Salut,
OK pour les S_POST...
OK pour le unset ($erreur)
pour le !@getimagesize, c'est un controle de plus... vu que le controle sur les types mime controlent... les mime type. En fait logiquement je c=devrais mettre ce controle en premier.
Pour le realpath, oui dans mon code j'ai mon "vrai" realpath

Et non, je n'ai pas de message d'erreur, sauf un qui me dit attention division par zero à la ligne 57 (ligne 57 dans le code posté ci-dessus), ce qui est normal, vu que d'image il n'y a point...

Donc merci de ton message, ca va me permettre de corriger les petites maladresses de mon code, mais sur l'essentiel, je ne comprends toujours pas. Une autre idée ;-) ?

Hors ligne

#4 11-10-2010 11:35:17

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

J'ai suivi ton conseil et fait un var_dump pour voir ce que le $_FILE contenait et voila ce qu'il m'a retourné avec une image test.jpg

array(1) { ["image"]=>  array(5) { ["name"]=>  string(8) "test.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(22) "/var/log/tmp/phpNuSKYw" ["error"]=>  int(0) ["size"]=>  int(50732) } }

je ne sais pas comment interprété ca ? Apparemment il voit bien le fichier ? non ?

Hors ligne

#5 11-10-2010 20:37:17

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Pb upload d'une image

le fichier est bien arrivé sur le serveur dans le dossier temporaire.
Il n'est pas déplacé, cela peut être dû a :
- mauvais chemin (la dans l'exemple il est faux).
- un problème de droit sur le répertoire de destination


pour cela il faut voir ce que retourne move_uploaded_file (a mon avis false si je ne me goure pas).
a tu regardé le paramètre error_reporting ? (ou ajoute error_reporting(E_ALL); au début de ton fichier)

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#6 12-10-2010 10:54:24

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

Salut,
je n'ouvre pas un nouveau topic pour mon nouveau probleme, mais je te remercie, grace a toi le probleme ci-dessus est réglé.
Maintenant je suis de nouveau bloqué... Je m'explique :
Je propose un formulaire de modification d'une actualité. Le formulaire est affiché dynamiquement, il va chercher les données dans une table. Una ctualité est composée de 1 image + 4 champs texte.
Probleme : si le champ file pour remplacer l'image n'est pas renseigné, le formulaire envoie quand meme la donnée vide et du coup, comme evidemment le "fichier" (vide) n'est pas une image, le message d'erreur disant que ce n'est pas un format autorisé apparait.
J'ai fait un var_dump pour voir ce que le $_FILE contenanit et donc il envoie bien un $_FILE vide.
voila le code :
[code:php]
function modifyactus()
{
$id = $_GET['id'];
$date = date('d/m/Y');
$datecreation = "$date";
$statut = $_POST['statut'];
if ($_POST['texteFR']=="") { $erreurtextFR = "<span class='warning'>Le champ doit etre rempli !</span>"; }
else { $texteFR = str_replace("\r\n","<br />",$_POST['texteFR']); $_SESSION['texteFR'] = $_POST['texteFR']; }
if ($_POST['texteEN']=="") { $erreurtextEN = "<span class='warning'>Le champ doit etre rempli !<br /><em>The field must be completed !</em></span>"; }
else { $texteEN = str_replace("\r\n","<br />",$_POST['texteEN']); $_SESSION['texteEN'] = $_POST['texteEN'];}
if ($_POST['altimageFR']=="") { $erreuraltFR = "<span class='warning'>Le champ doit etre rempli !</span>"; }
else { $altimageFR = $_POST['altimageFR']; $_SESSION['altimageFR'] = $_POST['altimageFR']; }
if ($_POST['altimageEN']=="") { $erreuraltEN = "<span class='warning'>Le champ doit etre rempli !<br /><em>The field must be completed !</em></span>"; }
else { $altimageEN = $_POST['altimageEN']; $_SESSION['altimageEN'] = $_POST['altimageEN']; }

/* Ci-dessous ca ne marche pas. J'ai essayé avec if ($_FILES['images']!=""), essayé en inversant la condition : if (!isset($_FILES['image'])) if ($_FILES['image']==""), ... ca marche pas.
Le formulaire poste le contenu du champ file meme si celui-ci est vide. Et donc forcement ca génere une erreur de type d'image. */

if (isset($_FILES['image'])) {
$taille_max = 20000000; // taille limitée à 20 Mo
$dest_dossier = '/homez.325/meretmed/www/webdev/standis/images/actualites/';
$typeimage = array("image/png", "image/x-png", "image/jpeg", "image/jpg", "image/pjpg", "image/pjpeg", ); // types d'images autorisées
if ($_FILES['image']['size'] > $taille_max)
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !<br /><em>The file must be a jpg or png image less than 20 Mo size/weight !</em></span>"; }
elseif (!in_array($_FILES['image']['type'], $typeimage))
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpg (ou jpeg) ou png !<br /><em>The file type must be jpg (or jpeg) or png !</em></span>"; }
}
else { $lienimagemodif = $_SESSION['lienimage']; }

// Ci-dessous le reste de la fonction qui marche bien.

if ((!isset($erreurimg))&&(!isset($erreuraltFR))&&(!isset($erreuraltEN))&&(!isset($erreurtextFR))&&(!isset($erreurtextEN)))
{
$dest_fichier = basename($_FILES['image']['name']);
$dest_fichier = strtr($dest_fichier,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
$dest_fichier = strtolower($dest_fichier);
// copie du fichier
move_uploaded_file($_FILES['image']['tmp_name'], $dest_dossier . $dest_fichier);
$lienimagemodif = "images/actualites/$dest_fichier";
// Resize
$imgaredim="/homez.325/meretmed/www/webdev/standis/images/actualites/".$dest_fichier; // realpath du dossier de l'image a parametrer

$img_size = getimagesize($imgaredim);
$W_Src = $img_size[0];
$H_Src = $img_size[1];

$W_max = 150;

$W = $W_max;
$H = $W * ($H_Src / $W_Src);         

$size = getimagesize($imgaredim);

if (($size['mime']=='image/jpeg') || ($size['mime']=='image/jpg') || ($size['mime']=='image/pjpg') || ($size['mime']=='image/pjpeg')) {
$img_big = imagecreatefromjpeg($imgaredim);
$img_new = imagecreate($W, $H);
$img_mini = imagecreatetruecolor($W, $H);

imagecopyresized($img_mini,$img_big,0,0,0,0,$W,$H,$size[0],$size[1]);
imagejpeg($img_mini,$imgaredim);
}

elseif (($size['mime']=='image/png') || ($size['mime']=='image/x-png')) {
$img_big = imagecreatefrompng($imgaredim);
$img_new = imagecreate($W, $H);
$img_mini = imagecreatetruecolor($W, $H)
or   $img_mini = imagecreate($W, $H);

imagecopyresized($img_mini,$img_big,0,0,0,0,$W,$H,$size[0],$size[1]);
imagepng($img_mini,$imgaredim);
}
//if (isset($lienimagemodif)) { $clause=",lienimage='$lienimagemodif'"; } else { $clause=""; }

require "cfg_config.php";
$db = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die ("Impossible de se connecter : " . mysql_error());
mysql_select_db($cfgBase,$db);
   
$query = "UPDATE actualites SET texteFR='$texteFR',texteEN='$texteEN',lienimage='$lienimagemodif',altimageFR='$altimageFR',altimageEN='$altimageEN',datecreation='$datecreation',statut='$statut' WHERE rang='$id'";
mysql_query($query) or die('Erreur SQL !<br />'.$query.'<br />'.mysql_error());

echo "<span class='success'>Les modifications ont été enregistrées avec succès.</span>";

mysql_close($db);
return (0);
}
else  {

echo var_dump ($_FILES); // avec ca je vois que le contenu $_FILES['image'] est envoyé meme si le champ file "image" est vide
if (isset($erreurimg)) echo $erreurimg; // et donc là il m'affiche l'erreur $erreurimg qui correspond au mauvais type d'image
elseif (isset($erreuraltFR)) echo $erreuraltFR;
elseif (isset($erreuraltEN)) echo $erreuraltEN;
elseif (isset($erreurtextEN)) echo $erreurtextEN;
elseif (isset($erreurtextFR)) echo $erreurtextFR;
else echo "ya une couille dans le potage;";
}
}[/code]

Dernière modification par fanch75 (12-10-2010 13:38:28)

Hors ligne

#7 12-10-2010 14:31:26

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

une idée , quelqu'un ? merci !

Hors ligne

#8 12-10-2010 14:52:19

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Pb upload d'une image

move_uploaded_file($_FILES['image']['tmp_name'], $dest_dossier . $dest_fichier);

à ce moment $dest_dossier et $dest_fichier semble être vide wink

a++

Hors ligne

#9 12-10-2010 16:10:20

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

euh non c'est pas ca le probleme... ce qui ne marche pas c'est que si le champ file "image" est vide il est quand meme envoyé, malgré le contrôle :
[code php]
if (isset($_FILES['image'])) {
$taille_max = 20000000; // taille limitée à 20 Mo
$dest_dossier = '/homez.325/meretmed/www/webdev/standis/images/actualites/';
$typeimage = array("image/png", "image/x-png", "image/jpeg", "image/jpg", "image/pjpg", "image/pjpeg", ); // types d'images autorisées
if ($_FILES['image']['size'] > $taille_max)
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !<br /><em>The file must be a jpg or png image less than 20 Mo size/weight !</em></span>"; }
elseif (!in_array($_FILES['image']['type'], $typeimage))
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpg (ou jpeg) ou png !<br /><em>The file type must be jpg (or jpeg) or png !</em></span>"; }
}
else { $lienimagemodif = $_SESSION['lienimage']; }
[/code]

Hors ligne

#10 12-10-2010 16:17:34

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Pb upload d'une image

Le champ existe (vide ou nonà => isSet() = true
Le champ existe mais est vide => empty() = true
Le champ existe et n'est pas vide => empty() = false

Hors ligne

#11 12-10-2010 16:31:57

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

Merci ! donc c'etait un probleme d'ignorance de ma part des fonctions php:rolleyes:. Je me coucherai moins bete ce soir. Merci encore wink

Hors ligne

#12 12-10-2010 17:37:24

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

Parlé trop vite . Marche pas non plus avec empty(). Peut etre est-ce mal écrit ? Toujours la meme erreur, a l'envoi du formulaire, une valeur vide est envoyée via le champ file "image"... et donc erreur de type d'image autorisés.


if (empty($_FILES['image'])) { $lienimagemodif = $_SESSION['lienimage']; }
else { // ici j'ai aussi essayé avec elseif (!empty($_FILES['image']))
$taille_max = 20000000;
$dest_dossier = '/homez.325/meretmed/www/webdev/standis/images/actualites/';
$typeimage = array("image/png", "image/x-png", "image/jpeg", "image/jpg", "image/pjpg", "image/pjpeg");
if ($_FILES['image']['size'] > $taille_max)
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !<br /><em>The file must be a jpg or png image less than 20 Mo size/weight !</em></span>"; }
elseif (!in_array($_FILES['image']['type'], $typeimage))
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpg (ou jpeg) ou png !<br /><em>The file type must be jpg (or jpeg) or png !</em></span>"; }
}
 

Dernière modification par fanch75 (12-10-2010 17:38:38)

Hors ligne

#13 12-10-2010 23:39:17

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Pb upload d'une image

test l’existence de $_FILES['image'] et de $_FILES['images']['name'] (par exemple) il faut que cette valeur soit différente de zéro. tu peut utiliser empty, si ça vaut zéro il sera convertis en false, donc empty retourneras true smile

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#14 13-10-2010 13:03:21

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

merci de ton conseil...  pourrais tu etre plus precis ? j'ai essayé ca et ca ne marche toujours pas... je nage
[code = php]
if (isset($_FILES['image'],$_FILES['image']['name'])) {
if (empty($_FILES['image'])) { $lienimagemodif = $_SESSION['lienimage']; }
else {
$taille_max = 20000000; // taille limitée à 20 Mo - A voir avec le param max_file_size du serveur
$dest_dossier = '/homez.325/meretmed/www/webdev/standis/images/actualites/'; // realpath du dossier de l'image a parametrer
$typeimage = array("image/png", "image/x-png", "image/jpeg", "image/jpg", "image/pjpg", "image/pjpeg"); // types d'images autorisées
if ($_FILES['image']['size'] > $taille_max)
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !<br /><em>The file must be a jpg or png image less than 20 Mo size/weight !</em></span>"; }
elseif (!in_array($_FILES['image']['type'], $typeimage))
{ $erreurimg = "<span class='warning'>L&apos;image doit etre un fichier jpg (ou jpeg) ou png !<br /><em>The file type must be jpg (or jpeg) or png !</em></span>"; }
}
}
[/code]

Hors ligne

#15 13-10-2010 13:14:09

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Pb upload d'une image

bon bah désolé pour tout ca en fait, c'était une mauvaise logique de ma part... je teste si le champ est vide... et apres dans la fonction meme si il est vide je l'envoie via un move_uploaded_file etc... donc forcément. Merci en tout cas pour vos réponses ! smile

Hors ligne

Pied de page des forums