Aller au contenu

Connaitre l'extension d'un fichier de manière certaine


equids

Sujets conseillés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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é par paolodelmare
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

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



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