Upload d'images valides qui ne se produit pas

Mammouth du PHP | 2937 Messages

02 nov. 2006, 18:12

Salut à tous!

Pour mon 100ème message, j'ai un site que je suis en train de refaire et qui doit comporter une interface d'administration, qui comporte, entre autres, la possibilité de créer de nouveaux menus.

La création s'effectue sous forme d'un formulaire, qui comporte deux champs pour l'upload d'images.

Voici un extrait du code que j'ai pondu.
<?php 
// Vérification des dimensions de l'image lors de son chargement
function image_largeur($fichier){
  list($largeur, $hauteur)=getimagesize($fichier);
  return $largeur;
}
function image_hauteur($fichier){
  list($largeur, $hauteur)=getimagesize($fichier);
  return $hauteur;
}
?>
<!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" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Panneau d'administration</title>
</head>

<body id="haut">
<div id="page">
  <div id="contenu">
    <h2>Panneau d'administration</h2>
    <h3>Cr&eacute;ation d'un nouveau menu</h3>
<?php 
  $menu_intitule=(isset($_POST['menu_intitule']))? encodage_html($_POST['menu_intitule']): '';
  $menu_type=(isset($_POST['menu_type']))? $_POST['menu_type']: '';
  $menu_description=(isset($_POST['menu_description']))? $_POST['menu_description']: '';
  $menu_mot_cle=(isset($_POST['menu_mot_cle']))? encodage_html($_POST['menu_mot_cle']): '';
  if (isset($menu_intitule) && !empty($menu_intitule) && isset($menu_type) && !empty($menu_type)
&& isset($menu_description) && !empty($menu_description) && ($menu_mot_cle) && !empty($menu_mot_cle)
&& isset($_FILES['image']) && isset($_FILES['miniature'])){
    if (is_uploaded_file($_FILES['image']['tmp_name']) && eregi("gif|jpg|png", $_FILES['image']['tmp_name'])
&& image_largeur($_FILES['image']['tmp_name'])<=400 && filesize($_FILES['image']['tmp_name'])<=2048000
&& is_uploaded_file($_FILES['miniature']['tmp_name']) && eregi("gif|jpg|png", $_FILES['miniature']['tmp_name'])
&& image_largeur($_FILES['miniature']['tmp_name'])==60 && image_hauteur($_FILES['miniature']['tmp_name'])==40
&& filesize($_FILES['miniature']['tmp_name'])<=51200){
      $image=url($menu_intitule).strtolower(substr($_FILES['image']['tmp_name'], -4));
      $miniature='miniature-'.url($menu_intitule).strtolower(substr($_FILES['miniature']['tmp_name'], -4));
      $requete_menu_insertion="INSERT INTO menus (image, meta_description, meta_mot_cle, miniature, nom, type_menu, url)
VALUES ('$image', '".mysql_real_escape_string($menu_description)."', '".mysql_real_escape_string($menu_mot_cle)."',
'$miniature', '".mysql_real_escape_string($menu_intitule)."', '".intval($menu_type)."', '".url($menu_intitule)."')";
      mysql_query($requete_menu_insertion);
      move_uploaded_file($_FILES['image']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/images/'.$image);
      move_uploaded_file($_FILES['miniature']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/images/'.$miniature);
      if (mysql_insert_id()==0){
?>
    <p>Le nouveau menu n'a pas pu &ecirc;tre ins&eacute;r&eacute;. Veuillez r&eacute;essayer plus tard.</p>
<?php 
      }
      else{
?>
    <p>Le nouveau menu a &eacute;t&eacute; ins&eacute;r&eacute; avec succ&egrave;s.</p>
<?php 
      }
    }
    else{
?>
    <p>Le nouveau menu n'a pas pu &ecirc;tre ins&eacute;r&eacute;.
V&eacute;rifiez le format, les dimensions et la taille des images que vous voulez charger.</p>
<?php 
    }
?>
    <ul class="modification">
      <li><a href="admin.php?tache=menus-creation">Cr&eacute;er un autre menu</a></li>
      <li><a href="admin.php?tache=menus-apercu">Retour &agrave; l'aper&ccedil;u des menus</a></li>
      <li><a href="admin.php">Retour au panneau d'administration</a></li>
    </ul>
<?php 
  }
  else{
?>
    <form id="menus-creation" method="post" action="admin.php" enctype="multipart/form-data">
      <p>Intitul&eacute; du menu</p>
      <p><input id="menu_intitule" name="menu_intitule" type="text" value="<?php echo $menu_intitule ?>" /></p>
      <p>Type de menu</p>
      <p>
        <select id="menu_type" name="menu_type">
          <option value="1"<?php if ($menu_type==1) echo ' selected="selected"'; else echo ''; ?>>Recherche</option>
          <option value="2"<?php if ($menu_type==2) echo ' selected="selected"'; else echo ''; ?>>Cybercommerces</option>
        </select>
      </p>
      <p>Description du menu</p>
      <p><textarea id="menu_description" name="menu_description" cols="50" rows="5"><?php echo $menu_description ?></textarea></p>
      <p>Mots-cl&eacute;s du menu
(&agrave; saisir sans caract&egrave;re sp&eacute;cial
 en les s&eacute;parant par une virgule et un espace, comme suit&nbsp;: mot-cle, autre mot-cle)</p>
      <p><textarea id="menu_mot_cle" name="menu_mot_cle" cols="50" rows="5"><?php echo $menu_mot_cle ?></textarea></p>
      <p>Image du menu
(elle doit &ecirc;tre au format .gif, .jpg ou .png et avoir une largeur de 400 pixels maximum
 et ne doit pas exc&eacute;der 2 Mo)</p>
      <p><input class="upload" name="image" type="file" /></p>
      <p>Miniature du menu
(elle doit &ecirc;tre au format .gif, .jpg ou .png et avoir une dimension de 60 pixels de largeur sur 40 de hauteur
 et ne doit pas exc&eacute;der 50 ko)</p>
      <p><input class="upload" name="miniature" type="file" /></p>
      <p><input class="validation" type="submit" value="Valider" /></p>
    </form>
<?php 
  }
?>
  </div>
</div>
</body>
</html>
Même si les images respectent les exigences du script en matière de format, de dimensions et de taille, j'obtiens le message "Le nouveau menu n'a pas pu être inséré. Vérifiez le format, les dimensions et la taille des images que vous voulez charger".

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

02 nov. 2006, 18:26

Joyeux centième message, joyeux centième message, joyeux ceeeeentième message, joyeux centième meeesssagggeeuuhh !!

Faut procéder par étape... dans quel cas est ce que tu peux avoir ce message ?
> Quand au moins une des conditions du if n'est pas remplie

Quelles sont les conditions qui doivent être remplies
> Est ce que $_FILES['image']['tmp_name'] a bien été uploadé ?
> Est ce que le nom temporaire de l'image contient la chaine "gif", "jpg" ou "png" ? (et en général les fichier temporaire ont des noms temporaires, donc pas d'extension, à ta place je commencerais par regarder de ce côté là)
> Est ce que image_largeur($_FILES['image']['tmp_name']) est inférieur à 400 ?
> Est ce que le poids du fichier $_FILES['image']['tmp_name'] est inférieur 2048000 ?
> Même questions pour $_FILES['miniature'] ?

Affiche les valeurs (voire les tests) dans ces cas là, tu verras tout de suite l'erreur apparaitre :
echo eregi("gif|jpg|png", $_FILES['image']['tmp_name']); // si ca ne retourne pas 1/vrai
echo $_FILES['image']['tmp_name']; // et tu seras fixé :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 2937 Messages

02 nov. 2006, 18:50

Salut, Ryle!

Finalement, en corrigeant le chemin du répertoire destinataire et modifiant le code comme suit:
<?php 
if (is_uploaded_file($_FILES['image']['tmp_name']) && eregi("gif|jpg|png", $_FILES['image']['name']) && image_largeur($_FILES['image']['tmp_name'])<=400 && filesize($_FILES['image']['tmp_name'])<=2048000 && is_uploaded_file($_FILES['miniature']['tmp_name']) && eregi("gif|jpg|png", $_FILES['miniature']['name']) && image_largeur($_FILES['miniature']['tmp_name'])==60 && image_hauteur($_FILES['miniature']['tmp_name'])==40 && filesize($_FILES['miniature']['tmp_name'])<=51200){
      $image=url($menu_intitule).strtolower(substr($_FILES['image']['name'], -4));
      $miniature='miniature-'.url($menu_intitule).strtolower(substr($_FILES['miniature']['name'], -4));
      $requete_menu_insertion="INSERT INTO menus (image, meta_description, meta_mot_cle, miniature, nom, type_menu, url) VALUES ('$image', '".mysql_real_escape_string($menu_description)."', '".mysql_real_escape_string($menu_mot_cle)."', '$miniature', '".mysql_real_escape_string($menu_intitule)."', '".intval($menu_type)."', '".url($menu_intitule)."')";
      mysql_query($requete_menu_insertion);
      move_uploaded_file($_FILES['image']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].$repertoire_destinataire.$image);
      move_uploaded_file($_FILES['miniature']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].$repertoire_destinataire.$miniature);
      if (mysql_insert_id()==0){
?>
    <p>Le nouveau menu n'a pas pu &ecirc;tre ins&eacute;r&eacute;. Veuillez r&eacute;essayer plus tard.</p>
<?php 
      }
      else{
?>
    <p>Le nouveau menu a &eacute;t&eacute; ins&eacute;r&eacute; avec succ&egrave;s.</p>
<?php 
      }
    }
?>
Je suis parvenu à mes fins. :)
Joyeux centième message, joyeux centième message, joyeux ceeeeentième message, joyeux centième meeesssagggeeuuhh !!
Merci. :wink: