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 14:02:53

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

controle type mime

Bonjour,
j'ai qques problemes avec un script d'upload d'image.
Mes controles pour verifier que c'est bien une image qui est uploadée via mon formulaire ne fonctionnent pas. Du coup, n'importe quel fichier peut etre uploadé, ce qui est évidemment hors de question...

Voici le code, pourtant vraiment simple :

<?php
if (isset($_FILES['image']))
{
$taille_max = 20000000; // taille limitée à 20 Mo
$dest_dossier = '/images/actualites/'; // realpath du dossier de l'image

// gestion des erreurs, c'est ca qui ne marche pas
if (($_FILES['image']['size'] > $taille_max) || ($_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'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !</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";
}
}
else lienimage = "";

?>

Quelle est l'erreur ? et sinon, avez-vous une autre solution que de controler les type mime pour m'assurer que c'est bien une image jpg ou png de moins de 20 Mo qui est uploadée ? Merci

Hors ligne

#2 11-10-2010 14:30:59

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

Re : controle type mime

Pour quoi des OU ? ^^
Avec un ET quelque soit la valeur fausse tout est faux.

Hors ligne

#3 11-10-2010 14:43:44

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

Re : controle type mime

Merci de ta réponse mais...

tu veux dire si j'ecris ca :

<?php
if (($_FILES['image']['size'] > $taille_max) && ($_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"))
?>

Ca veut dire : si "la taille est sup à 20 Mo" ET QUE "le type mime n'est pas jpeg" ET QUE ""...
Donc si j'ai un fichier jpeg ou png qui fait une taille superieure a 20 Mo l'erreur ne sera pas gérée. Alors qu'avec des || je gère chaque cas. Non ? J'ai faux ?

Et puis ca ne me dit pas pourquoi les controles marchent pas. Je viens encore de tester et ca ne marche effectivement pas. Si je les enleve, tout le script s'execute bien. Sinon, non seulement n'importe quel type de fichier est uploadé, mais en plus, le lien dans la table ne s'écrit pas... heeelp !

Hors ligne

#4 11-10-2010 15:29:28

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

Re : controle type mime

Hum disons que j'ai aussi faux que toi.
J'ai du mal à raisonner à la négative, mais tes OU de base ne peuvent fonctionner.
Simplifions la condition en : "n'est pas du png" OU "n'est pas du jpeg" OU "taille incorrecte"
Tu rentres dans ta condition si tu as du png car tu rends le second test vrai.
Tu rentres dans ton condition si tu as du jpeg car tu rends le premier test vrai.

C'est donc ici qu'il faut mettre des ET (mais pas avec la vérification de la taille). En gros si tu n'arrives pas à déterminer le type (parcours de toutes les conditions via les ET) c'est que le type est mauvais donc la condition doit être bonne.

Voici une solution pour simplifier l'écriture et la compréhension :

$liste_type = array("image/jpeg", "image/png");
if( ( $_FILES['image']['size'] > $taille_max ) || ( !in_array($_FILES['image']['type'], $liste_type) ) )
  //condition erreur

Hors ligne

#5 11-10-2010 15:57:29

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

Re : controle type mime

Oui je vais tester ca !
Bon, j'ai fait du debug et j'avance... un peu. Mais cette verification de type mime me pose encore des problemes. Voila le code de ma fonction complete. J'ai veriufié et la gestion d'erreur de taille fonctionne. Par contre avec ce code, j'ai toujours l'erreur de type mime, c'est a dire qu'aucun fichier ne passe. J'ai mis des !== mais je suis pas sur...

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

if (isset($_FILES['image']))
{
$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

if ($_FILES['image']['size'] > $taille_max)
{ $erreur = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !</span>"; }
elseif (($_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'>L&apos;image doit etre un fichier jpeg ou png !</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="/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);
}
}
}
else  {
$lienimage = "";
}

if (!isset($erreur)) {

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);
}
else echo $erreur;
}

}

Hors ligne

#6 11-10-2010 16:00:49

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

Re : controle type mime

euh... la deuxieme fonction n'est pas a prendre en compte... petite erreur de copier-coller
C'est réparé et colorisé

MK

Hors ligne

#7 11-10-2010 16:14:55

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

Re : controle type mime

Merci millie fois. Avec ta solution, ca marche.
Donc je repose la fonction qui marche au cas ou ca puisse servir a d'autres ...

<?php
function addactus()
{
$date = date('d/m/Y');
$datecreation = "$date";
if (isset($_POST['texteFR'])) { $texteFR = str_replace("\r\n","<br />",$_POST['texteFR']); }
if (isset($_POST['texteEN'])) { $texteEN = str_replace("\r\n","<br />",$_POST['texteEN']); }
if (isset($_POST['altimageFR'])) { $altimageFR = $_POST['altimageFR']; }
if (isset($_POST['altimageEN'])) { $altimageEN = $_POST['altimageEN']; }

if (isset($_FILES['image']))
{
$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", );

if ($_FILES['image']['size'] > $taille_max)
{ $erreur = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png d&apos;un poids inférieur à 20 Mo !</span>"; }
elseif (!in_array($_FILES['image']['type'], $typeimage))
{ $erreur = "<span class='warning'>L&apos;image doit etre un fichier jpeg ou png !</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="/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);
}
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);
}
else  {
echo $erreur;
$lienimage = "";
}
}
}
?>

Hors ligne

Pied de page des forums