Aller au contenu

savoir les dimensions de l'image uploadé..


Sujets conseillés

Posté (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é :blink:), 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 :D

Modifié par sarc
Posté

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 ? :D

Posté (modifié)

Bah là je vois pas, chez moi ça fonctionne :huh:

En gros, j'utilise ça :

// 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>

Modifié par lupucide
Posté

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 ?

Posté

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] // width
echo $a[1] // height

Posté

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 !

Posté (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é par lupucide
Posté

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 !

Posté

Bah on dirait que tu n'es pas le seul, personne n'a su me répondre... :/

Décidément, le GD est capricieux :P Trop pour moi !

Posté
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.

  • 2 semaines plus tard...
Posté

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:

// 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:

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.

Posté

Tu as le formulaire qui va avec s'il te plait ? (tant qu'à faire ;) )

Posté (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é par lupucide
Posté (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é par portekoi
Posté (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 :lol:

</edit>

Modifié par lupucide
Posté

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 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.

Posté

Moi j'ai toujours pas trouvé pour moi, malgré des essais de tout ce que j'ai pu trouver... :D

Mes membres ont parfois des avatars de 500px de large téléchargés GRRRrrrr

Pourquoi moi :'(

Posté

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 ? :D

Posté

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).

Posté

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 :)

Posté

Country, ça fait pas trop chauffer le serveur ? J'ai peur de prendre un peu trop de ressource inutilement... :/

Posté

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é :huh:

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...