Sarc Posté 3 Avril 2005 Posté 3 Avril 2005 (modifié) 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é ), 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 Modifié 3 Avril 2005 par sarc
lupucide Posté 3 Avril 2005 Posté 3 Avril 2005 $file = $_FILES['image']['tmp_name'];list($width, $height) = getimagesize($file);echo $width;echo $height;
Sarc Posté 3 Avril 2005 Auteur Posté 3 Avril 2005 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 ?
lupucide Posté 3 Avril 2005 Posté 3 Avril 2005 (modifié) Bah là je vois pas, chez moi ça fonctionne En gros, j'utilise ça : // Test de la variableif (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> Modifié 3 Avril 2005 par lupucide
Sarc Posté 3 Avril 2005 Auteur Posté 3 Avril 2005 Oui c'est assez étonnant... Je viens de faire des tests : j'ai mis getimagesize(avatars/2.jpg); La il me renvoie les bonnes données et ensuite, avec 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 Posté 3 Avril 2005 Posté 3 Avril 2005 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 ? $a = getimagesize($file);echo $a[0] // widthecho $a[1] // height
Sarc Posté 3 Avril 2005 Auteur Posté 3 Avril 2005 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 Posté 3 Avril 2005 Posté 3 Avril 2005 (modifié) 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 ? Modifié 3 Avril 2005 par lupucide
Sarc Posté 4 Avril 2005 Auteur Posté 4 Avril 2005 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 Posté 4 Avril 2005 Posté 4 Avril 2005 /me se retire sur la pointe des pieds, honteux de ne pas avoir de réponse à fournir.
Sarc Posté 5 Avril 2005 Auteur Posté 5 Avril 2005 Bah on dirait que tu n'es pas le seul, personne n'a su me répondre... :/ Décidément, le GD est capricieux Trop pour moi !
Anonymus Posté 6 Avril 2005 Posté 6 Avril 2005 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 Posté 18 Avril 2005 Posté 18 Avril 2005 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 // Test de la variableif (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 Je donne quand même la fonction clean_url(), au cas ou elle serait utile. 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 Posté 18 Avril 2005 Posté 18 Avril 2005 Tu as le formulaire qui va avec s'il te plait ? (tant qu'à faire )
lupucide Posté 18 Avril 2005 Posté 18 Avril 2005 (modifié) Bien entendu <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" /> <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. Modifié 18 Avril 2005 par lupucide
Portekoi Posté 18 Avril 2005 Posté 18 Avril 2005 (modifié) 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 Modifié 18 Avril 2005 par portekoi
lupucide Posté 18 Avril 2005 Posté 18 Avril 2005 (modifié) 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 </edit> Modifié 18 Avril 2005 par lupucide
lupucide Posté 18 Avril 2005 Posté 18 Avril 2005 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à ?). // Test de la variableif (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 Posté 19 Avril 2005 Auteur Posté 19 Avril 2005 Moi j'ai toujours pas trouvé pour moi, malgré des essais de tout ce que j'ai pu trouver... Mes membres ont parfois des avatars de 500px de large téléchargés GRRRrrrr Pourquoi moi :'(
lupucide Posté 19 Avril 2005 Posté 19 Avril 2005 Est-ce que tu a tenté le getimagesize() sur l'image sauvegardé sur le serveur ?
Sarc Posté 19 Avril 2005 Auteur Posté 19 Avril 2005 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 ?
lupucide Posté 19 Avril 2005 Posté 19 Avril 2005 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 Posté 19 Avril 2005 Posté 19 Avril 2005 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
Sarc Posté 19 Avril 2005 Auteur Posté 19 Avril 2005 Country, ça fait pas trop chauffer le serveur ? J'ai peur de prendre un peu trop de ressource inutilement... :/
Country Posté 19 Avril 2005 Posté 19 Avril 2005 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 ). 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é
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant