Vous n'êtes pas identifié(e).
Pages :: 1
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) :
$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'est pas accepté. Convertissez votre image en jpg ou en png avant de l'envoyer, merci.</span>";
}
elseif ($_FILES['image']['size'] > $taille_max)
{
$erreur = "<span class='warning'>L'image doit avoir un poids inférieur à 20 Mo !</span>";
}
elseif(!@getimagesize($_FILES['image']['tmp_name']))
{
$erreur = "<span class='warning'>Vous avez tenté d'envoyer un fichier qui n'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 :
Merci de vos lumières !
Hors ligne
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 ).
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
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
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
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
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'image doit etre un fichier jpeg ou png d'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'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
une idée , quelqu'un ? merci !
Hors ligne
move_uploaded_file($_FILES['image']['tmp_name'], $dest_dossier . $dest_fichier);
à ce moment $dest_dossier et $dest_fichier semble être vide
a++
Hors ligne
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'image doit etre un fichier jpeg ou png d'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'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
Merci ! donc c'etait un probleme d'ignorance de ma part des fonctions php:rolleyes:. Je me coucherai moins bete ce soir. Merci encore
Hors ligne
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.
Dernière modification par fanch75 (12-10-2010 17:38:38)
Hors ligne
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
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
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'image doit etre un fichier jpeg ou png d'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'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
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 !
Hors ligne
Pages :: 1