Version complète: sur le forum Webmaster Hub : savoir les dimensions de l'image uploadé..
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
sarc
Bonjour !

J'aimerais voir si l'avatar envoyé par le membre ne dépasse pas 120px*120px... Seulement, la fonction GetImageSize($_FILES['image']['tmp_name']) ne marche pas...
Il faut mettre quel paramètre pour qu'elle marche ? Je n'ai pas trouvé de variables dans $_FILES qui me permettait de savoir les dimensions en pixels de l'image uploadé, et je n'arrive pas à les avoir avec GetImageSize...

Une solution ?

Sinon, pendant que j'y suis ! Pour l'upload des images encore... (compliqué blink.gif), il m'arrive souvent de recevoir des photos seulement à moitié uploadées. Par exemple, sur cette image, juste le haut est uploadé, et elle est acceptée car sa taille en ko est plus petite que la taille limite... Ca fait souvent ça, et je ne sais pas pourquoi ! Vu la taille en px de l'image, elle devait être trop grosse à la base, alors je ne sais pas pourquoi elle n'est pas bloquée complètement, et pourquoi ya une moitié qui vient... :/

Si vous pouviez m'expliquer tout ça, je comprendrais peut-être l'envoi d'images un peu mieux... :/

Merci d'avance biggrin.gif
lupucide
CODE
$file = $_FILES['image']['tmp_name'];
list($width, $height) = getimagesize($file);
echo $width;
echo $height;
sarc
Bah nan justement lupicide, ça ne marche pas ! J'ai bien essayé tout ça, mais le tableau renvoyé est desespérement vide...

D'autres idées ? biggrin.gif
lupucide
Bah là je vois pas, chez moi ça fonctionne huh.gif

En gros, j'utilise ça :

CODE
// Test de la variable
if (isset($_POST['go']) == 'Envoyer') {
    if (isset($_FILES['image']['tmp_name'])) {
 // Vérification de l'extension
 if (($_FILES['image']['type']) != 'image/jpeg') {
     $jpg ="<p>L'image doit-être au format JPG.</p> \n";
 }
 else {
     $file = $_FILES['image']['tmp_name'];
     $newfile = clean_url($_FILES['image']['name']);
     // Définition de la largeur et de la hauteur maximale
     $width = 700;
     $height = 420;
     // Cacul des nouvelles dimensions
     list($width_orig, $height_orig) = getimagesize($file);
     if ($width != $width_orig) {
     $orig_width = $width;
     }
     if ($height != $height_orig) {
   $orig_height = $height;
     }
     // Redimensionnement
     $image_p = imagecreatetruecolor($width, $height);
     $image = imagecreatefromjpeg($file);
     imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
     // Enregistrement du fichier image
     if (!imagejpeg($image_p, './images/'.$newfile, 100)) {
   $thumb = "<p>Erreur lors du redimensionnement de l'image.</p> \n";
     }
     // Enregistrement dans la BDD
     $sql = _AT_mysql_connect($server, $login, $password);
     if(!$sql) {
   $bdd = "<p>Echec lors de la connexion à la base de données.</p> \n";
     }
     mysql_select_db($base, $sql);
     $req = mysql_query('INSERT INTO images VALUES("", "'.date("Y-m-d H:i:s").'", "'.$newfile.'")');
     mysql_close($sql);
     header ('Location: ./images/?img='.$newfile);
     exit();
 }
    }
}
?>


Si ça peut te servir.

<edit>
Il me semble qu'il y a aussi quelque chose du genre source-x et source-y (à peu près), pas le temps de faire une recherche, désolé.
</edit>
sarc
Oui c'est assez étonnant...

Je viens de faire des tests :
j'ai mis
CODE
getimagesize(avatars/2.jpg);


La il me renvoie les bonnes données

et ensuite, avec
CODE
getimagesize(/avatars/2.jpg);

Il ne me renvoie rien !

Or, en mettant $file=$_FILES['image']['tmp_name'];, il me renvoie un nom de fichier avec un / au début !
C'est peut-être ça qui gène ?

Toi il te renvoie quoi ton $file ?
lupucide
Mon $file étant un fichier temporaire son nom n'est qu'une valeur incompréhensible.

Si ton fichier n'est pas ['tmp_name'] il faut préçiser le chemin complet vers l'image. A la rigueur test avec $file = './images/2.jpg';.

Sinon, à tu essayé ça ?

CODE
$a = getimagesize($file);
echo $a[0] // width
echo $a[1] // height
sarc
nan mais si lupucide, mais je sais pas si t'as vu, mais $file renvoie /tmp/FDOJDF par exemple ! Et avec un slash au départ, les dimensions sont pas renvoyées sur mon serveur !
J'ai juste fait des tests avec une vraie image pour voir !!


Sinon, j'ai essayé de mettre à partir de la racine, mais rien de mieux, donc je ferai d'autres tests demain... Galère galère !

J'ai essayé ton autre méthode aussi, mais rien ne marche, c'est apparement l'image temporaire qui n'est pas trouvée !
lupucide
Voilà, je savais bien qu'il y avait une histoire de x et y pas loin de GD : imagesx et imagesy

Dans ton script tu a bien un isset pour controler la présence du fichier ?
sarc
Bah vu que le fichier est uploadé à la fin du script s'il n'y a pas d'erreur, c'est que le fichier est bon ! C'est en gros la même chose que toi, le même script, sauf qu'il marche pas chez moi quoi !
lupucide
/me se retire sur la pointe des pieds, honteux de ne pas avoir de réponse à fournir. whistling.gif
sarc
Bah on dirait que tu n'es pas le seul, personne n'a su me répondre... :/
Décidément, le GD est capricieux tongue.gif Trop pour moi !
Anonymus
CITATION
mais $file renvoie /tmp/FDOJDF par exemple

Au lieu de prendre la valeur :
/tmp/FDOJDF

tu devrais prendre :
substr("/tmp/FDOJDF",1);


Ca doit enlever le slash du début.

Nico.
lupucide
Un petit up du thread. Je m'écarte un peu mais reste dans l'univers merveilleux de getimagesize().

J'ai mon script déjà présenté plus haut, légèrement modifié pour accepter l'upload de GIF, JPG et PNG.
Je n'arrive pas à faire accepter autre chose que du PNG blink.gif

CODE
// Test de la variable
if (isset($_POST['go']) == 'Envoyer') {
    if (isset($_FILES['image']['tmp_name'])) {
 $file = $_FILES['image']['tmp_name'];
 list($width_orig, $height_orig, $type) = getimagesize($file);
 // Vérification de l'extension
 $tab = array(1, 2, 3);
 foreach ($tab as $format);
 if ($type != $format) {
     header ('Location: ../?jpg');
     exit();
 }
 else {
     $newfile = clean_url($_FILES['image']['name']);
     // Définition de la largeur et de la hauteur maximale
     $width = 700;
     $height = 420;
     // Cacul des nouvelles dimensions
     if ($width != $width_orig) {
     $orig_width = $width;
     }
     if ($height != $height_orig) {
   $orig_height = $height;
     }
     // Redimensionnement
     $image_p = imagecreatetruecolor($width, $height);
     if ($type == 1) {
   $image = imagecreatefromgif($file);
     }
     if ($type == 2) {
   $image = imagecreatefromjpeg($file);
     }
     if ($type == 3) {
   $image = imagecreatefrompng($file);
     }
     imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
     // Enregistrement du fichier
     if (!imagejpeg($image_p, '../images/'.$newfile, 100)) {
   header ('Location: ../?thumb');
   exit();
     }
     // Enregistrement dans la BDD
     $sql = _AT_mysql_connect($server, $login, $password);
     if(!$sql) {
   header ('Location: ../?bdd');
   exit();
     }
     mysql_select_db($base, $sql);
     $req = mysql_query('INSERT INTO images VALUES("", "'.date("Y-m-d H:i:s").'", "'.$newfile.'")');
     mysql_close($sql);
     header ('Location: ../?view&id='.$newfile);
     exit();
 }
    }
}


Si quelqu'un arrive à m'aider, je lui fait un gros bisou hypocrite.gif

Je donne quand même la fonction clean_url(), au cas ou elle serait utile.

CODE
function clean_url($url) {
    // Retire majuscules et espaces de début et fin
    $url = strtolower(trim($url));
    // Cherche un format non JPG et le remplace
    $tab = array('gif', 'png');
    foreach ($tab as $format);
    $url = preg_replace('%'.$format.'%', 'jpg', $url);
    // Remplace les caractères accentués
    $url = strtr($url, 'àáâãäåçòóôõöøèéêëìíîïùúûüÿñ', 'aaaaaacooooooeeeeiiiiuuuuyn');
    // Vire les caractères spéciaux
    $url = preg_replace('%[^a-z]%', '', $url);
    // Replace le . devant JPG
    $url = preg_replace('%jpg%', '.jpg', $url);
    return $url;
}


Merci.
Anonymus
Tu as le formulaire qui va avec s'il te plait ? (tant qu'à faire wink.gif )
lupucide
Bien entendu smile.gif

CODE
<form action="./data/svg.php" method="post" enctype="multipart/form-data">
    <fieldset>
 <p><label for="selection">Sélection d'une image au format <acronym title="Joint Photographic Expert Group">JPG</acronym></label></p>
 <p><input type="file" name="image" size="30" id="selection" />
 <input type="hidden" name="MAX_FILE_SIZE" value="1024" />&nbsp;
 <input type="submit" name="go" value="Envoyer" /></p>
    </fieldset>
</form>


Au passage, quelqu'un connait il la limitation d'upload chez Free (aucune mention nul part) ?

PS : Ne pas faire attention au <label>, je n'ai pas encore inclus les nouveaux acronymes.
Portekoi
Juste une chose, ca donne quoi qu'en tu affiches $type?

Chez free, il me semble que c'est 900K

Fais une page avec dedans <?=phpinfo();?>

Bye

Portekoi
lupucide
CODE
 if ($type != $format) {
     header ('Location: ../?jpg');
     exit();
 }
 else {
     echo $type; exit();


PNG : 3

Pour GIF et JPG le header me renvois sur mon message d'erreur avant. Le problème est donc au niveau de $tab je pense.

<edit>
Merci pour le info(), je n'y avais pas penser laugh.gif
</edit>
lupucide
J'ai trouvé !

Mon tableau ne renvoyait que 3, comme devait le penser portekoi. Il suffisait alors de faire une comparaison du type avec les valeurs du tableau plutôt que d'assigner une nouvelle variable selon le type (arf, on me comprend là ?).

CODE
// Test de la variable
if (isset($_POST['go']) == 'Envoyer') {
    if (isset($_FILES['image']['tmp_name'])) {
 $file = $_FILES['image']['tmp_name'];
 list($width_orig, $height_orig, $type) = getimagesize($file);
 // Vérification de l'extension
 $tab = array(1, 2, 3);
 if (!in_array($type, $tab)) {
     echo $type; die;
 }
 else {
     $newfile = clean_url($_FILES['image']['name']);
     // Définition de la largeur et de la hauteur maximale
     $width = 700;
     $height = 420;
     // Cacul des nouvelles dimensions
     if ($width != $width_orig) {
     $orig_width = $width;
     }
     if ($height != $height_orig) {
   $orig_height = $height;
     }
     // Redimensionnement
     $image_p = imagecreatetruecolor($width, $height);
     if ($type == 1) {
   $image = imagecreatefromgif($file);
     }
     if ($type == 2) {
   $image = imagecreatefromjpeg($file);
     }
     if ($type == 3) {
   $image = imagecreatefrompng($file);
     }
     imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
     // Enregistrement du fichier
     if (!imagejpeg($image_p, '../images/'.$newfile, 100)) {
   header ('Location: ../?thumb');
   exit();
     }
     // Enregistrement dans la BDD
     $sql = _AT_mysql_connect($server, $login, $password);
     if(!$sql) {
   header ('Location: ../?bdd');
   exit();
     }
     mysql_select_db($base, $sql);
     $req = mysql_query('INSERT INTO images VALUES("", "'.date("Y-m-d H:i:s").'", "'.$newfile.'")');
     mysql_close($sql);
     header ('Location: ../?view&id='.$newfile);
     exit();
 }
    }
}


Et hop. Me reste maintenant à règler le problème de ma fonction qui utilise l'ancienne méthode.
sarc
Moi j'ai toujours pas trouvé pour moi, malgré des essais de tout ce que j'ai pu trouver... biggrin.gif
Mes membres ont parfois des avatars de 500px de large téléchargés GRRRrrrr

Pourquoi moi :'(
lupucide
Est-ce que tu a tenté le getimagesize() sur l'image sauvegardé sur le serveur ?
sarc
Une fois les images uploadées pour de vrai, le getimagesize marche, c'est sur l'image temporaire que ça refuse de marcher... Fou non ? biggrin.gif
lupucide
Ton getimagesize() sur l'image uploadée :
- si le controle est mauvais ; unlink() pour effacer et avertissement à l'utilisateur.
- si ok, poursuite normale de la proçédure.

Bref, ça donne une temps serveur plus long mais si tu n'arrive pas à calculer sur le fichier temporaire c'est une solution (temporaire, elle aussi).
Country
Pour mon site j'ai fait :

1. Vérification du poids et du type sur le fichier temporaire. Si pas d'erreur, on continue
2. Vérification des dimensions sur le fichier final. Suppression de ce dernier si elles sont trop grandes, sinon on continue.

Et ça marche plutôt bien smile.gif
sarc
Country, ça fait pas trop chauffer le serveur ? J'ai peur de prendre un peu trop de ressource inutilement... :/
Country
Je ne pense pas, le code n'est exécuté qu'à l'envoi d'un nouvel avatar donc pas trop souvent donc, sauf si tu as un nombre très important de visiteurs (ce qui n'est pas mon cas wink.gif).
De toute fasson c'est juste un déplacement de fichier, ça ne consomme pas trop de ressouces serveur, si ?

Et puis j'ai beau chercher je ne voit pas d'autres solutions pour vérifier les type/taille/dimensions de l'avatar envoyé huh.gif
sarc
Country, Lupucide le fait lui sur le fichier temporaire, voir la première page... C'est ce que je voulais faire à la base, mais bon, c'est vrai que ça change pas grand chose... Je vais tester la vérification après upload de l'image définitive, je vous dirai si ça bouffe des ressources ou pas biggrin.gif
Country
En effet, j'avou je n'avait pas lu son code wink.gif (et sa technique marche chez moi aussi).
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.