equids Posté 1 Mars 2009 Posté 1 Mars 2009 Je voudrais savoir si il y a un moyen "sur" en PHP de connaitre l'extension d'un fichier ? C'est pour un script d'ulpoad de photos, et je voudrais ne laisser passer que les jpg, png et gif. La méthode de prendre les 3 ou 4 derniers caractères après le point semble très peu sure. Je connais une autre méthode : list($largeur, $hauteur, $type, $attr)=getimagesize(exemple.jpg); Avec pour la variable $type : 1 = GIF , 2 = JPG , 3 = PNG Est ce que c'est la bonne méthode à votre avis ? Et il y a un dernier truc : Les images sont parfois enregistrées sous l'extnsion JPEG et non pas JPG chez l'utilisateur. Est ce que la fonction getimagesize leur donne un type N°2, ou est ce que le JPEG est exclu ? Et si il est exclu, comment gérer cette extension ? Merci
Kioob Posté 1 Mars 2009 Posté 1 Mars 2009 Hello, en fait ce que tu veux c'est connaître le format du contenu, pas l'extension du fichier, non ? Normalement getimagesize() se base uniquement sur le contenu du fichier, pas du tout sur l'extension. Tu peux appeler ton fichier toto.png, toto.php ou toto.jpeg, s'il s'agit d'une image JPG getimagesize te retournera le même résultat.
equids Posté 1 Mars 2009 Auteur Posté 1 Mars 2009 Donc a priori, c'est une méthode plutot sure. Merci Kioob, et en ce qui concerne la différence JPG ou JPEG ? La fonction leur donne un type N°2, ou est ce que les JPEG ne sont pas pris en compte ?
paolodelmare Posté 1 Mars 2009 Posté 1 Mars 2009 Je confirme, getimagesize() se base sur le contenu;tu peux lever une exception E_WARNING si le type est invalide, et un autre (E_NOTICE je crois) si c'est illisible. (la doc est sur php.net) Attention, pour les gros fichiers c'est assez lent, car il faut uploader l'image en entier avant de faire le check. On trouve des bons scripts qui permettent de vérifier le type avant le transfert. Si je retrouve ceux que j'ai déjà utilisé je mettrai le lien ici. (Perso je préfère imagemagick) Bon courage
petit-ourson Posté 1 Mars 2009 Posté 1 Mars 2009 On trouve des bons scripts qui permettent de vérifier le type avant le transfert. Des scripts exécutés en local (flash ?) chez l'utilisateur ? Si c'est le cas, il ne faut pas oublier de refaire les vérifications une fois le fichier envoyé (sur le serveur).
equids Posté 1 Mars 2009 Auteur Posté 1 Mars 2009 Bon c'est déja une bonne nouvelle pourles JPEG reconnus comme des JPG. Sinon, si il y a un bon script pour reconnaitre l'extension avant upload, je suis preneur
paolodelmare Posté 1 Mars 2009 Posté 1 Mars 2009 ->petit-ourson : non pas de flash ou de clien-side, c'est du server-side (download bit à bit de la portion permettant la vérif) voici un script (auteur: james relyea de zifiniti) <?php// Retrieve JPEG width and height without downloading/reading entire image.function getjpegsize($img_loc) { $handle = fopen($img_loc, "rb") or die("Invalid file stream."); $new_block = NULL; if(!feof($handle)) { $new_block = fread($handle, 32); $i = 0; if($new_block[$i]=="\xFF" && $new_block[$i+1]=="\xD8" && $new_block[$i+2]=="\xFF" && $new_block[$i+3]=="\xE0") { $i += 4; if($new_block[$i+2]=="\x4A" && $new_block[$i+3]=="\x46" && $new_block[$i+4]=="\x49" && $new_block[$i+5]=="\x46" && $new_block[$i+6]=="\x00") { // Read block size and skip ahead to begin cycling through blocks in search of SOF marker $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]); $block_size = hexdec($block_size[1]); while(!feof($handle)) { $i += $block_size; $new_block .= fread($handle, $block_size); if($new_block[$i]=="\xFF") { // New block detected, check for SOF marker $sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF"); if(in_array($new_block[$i+1], $sof_marker)) { // SOF marker detected. Width and height information is contained in bytes 4-7 after this byte. $size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8]; $unpacked = unpack("H*", $size_data); $unpacked = $unpacked[1]; $height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]); $width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]); return array($width, $height); } else { // Skip block marker and read block size $i += 2; $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]); $block_size = hexdec($block_size[1]); } } else { return FALSE; } } } } } return FALSE;}?> ce n'est pas un de ceux que je connais mais le principe est le même
petit-ourson Posté 1 Mars 2009 Posté 1 Mars 2009 A quel moment peux tu faire ta vérification via cette fonction ? Tant que l'envoi de ton image n'est pas fini, tu ne pourras pas appeler cette fonction. Tu économises du temps/ram serveur (en ne chargeant pas entièrement l'image) pour la vérification mais il faut quand même qu'elle soit totalement sur le serveur ? C'est bien ça ?
paolodelmare Posté 1 Mars 2009 Posté 1 Mars 2009 Non, le script récupère seulement la portion utile du fichier (bloc à bloc) pour la vérif page d'origine (cf commentaires) http://www.php.net/getimagesize
Kioob Posté 1 Mars 2009 Posté 1 Mars 2009 Sauf que le script PHP ne débute qu'une fois que le fichier est entièrement uploadé... Ce qui est indiqué dans les commentaires, c'est uniquement dans le cas du test d'une image distante, via HTTP par exemple.
paolodelmare Posté 1 Mars 2009 Posté 1 Mars 2009 (modifié) Absolument, dans ce cas la méthode permet de ne pas charger l'image entièrement [edit]Il est vrai que la question initiale portait sur un upload par formulaire Modifié 1 Mars 2009 par paolodelmare
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant