Post by SAMSalutatous,
Soit un formulaire avec un champ file nommé 'photo'
Je veux vérifier que c'est bien une image qui est envoyée
$ext_img = $_FILES['photo']['type'];
lors de mes essais certaines photos semblent ne pas communiquer leur
type (en particulier toutes celles de mon APN)
Je pensais que ce truc vérifiait l'extension du fichier et que les
majuscules/minuscules pouvaient faire avorter le machin, mais non.
Par contre un fichier sans extension n'est pas passé non plus.
Pourquoi ça marche pô ?
- le format serait : JPEG/JFIF
- le type de l'image serait : IMG DIGITAL IXUS 860 IS JPEG
Quelle autre soluce pourrait assurer que le fichier uploadé est bien une
image ?
Avec quoi comparer $ext_img pour s'assurer que l'image est bien du JPG,
du GIF, du PNG (pour les choix de post-traitements) ?
Mes essais se font dans mon Apache local en PHP 5.2.4
Au final, le formulaire sera sur un hébergeur en PHP 4.4.3-dev
Je te copie une méthode que je sors justement d'une classe d'upload
d'images, ce n'est certainement pas imparable, mais au moins ça ne se fie
pas simplement au type MIME, car si on ne contrôle que l'extention, il
suffit de renommer un fichier openoffice.odt en openoffice.jpg pour que ta
vérification ne serve plus à rien. Tu peux regarder et teste à partir de
ça. (comme c'est une méthode de classe on ne lui passe pas de paramètre,
elle récupère l'identifiant d'image par des propriétés de la fonction
($this->temporay_name etc. qui sont des infos qu'on récupèr dans php pour
les uploads, le début de la méthode publique t'indique ce que sont ces
propriétés :
public function verifUploadImage ($upload_array,$directory
$image_max_size)
{
# -- Le nom du fichier original sur la machine source -- #
$this->original_name = $upload_array['name'];
# -- Le type MIME du fichier, si le navigateur a fourni cette information.
Par exemple, "image/gif" -- #
$this->mime_type = $upload_array['type'];
# -- La taille du fichier envoyé, en octet -- #
$this->image_size = $upload_array['size'];
# -- Le nom temporaire du fichier qui sera chargé sur la machine
serveur -- #
$this->temporary_name = $upload_array['tmp_name'];
# -- erreurs sur l'upload -- #
$this->upload_error = $upload_array['error'];
# -- on contrôle la qualité du téléchargement du fichier -- #
...
}
Et voici la méthode qui tente de vérifier si une image annoncée en est bien
une.
private function verifImage () {
/**
La vérification des fichiers binaires d'image se fait en contrôlant la
signature hexadécimale de début de fichier.
En analysant des images existantes il semble qu'en hexadécimal les débuts
de fichiers soient les suivants :
Jpeg : FFD8FF
PNG : 89504E470D
Gif : 474946383961 (Gif89) et 474946383761 (Gif87)
*/
$suf_mime = eregi_replace("^.*/","",$this->mime_type);
if(file_exists($this->temporary_name)) {
$id = fopen($this->temporary_name,'rb');
$buffer = fread($id,6);
fclose($id);
}
$signature = bin2hex ($buffer);
$image_ok = false;
$result = array();
$suffixe = '';
if (substr($signature,0,6) == 'ffd8ff') {
$image_ok = true;
$info_message = "<li>La signature (".substr($signature,0,6).") de l'image
d'origine ".$this->original_name." atteste que c'est une image .jpg. Son
type mime annoncé était ".$this->mime_type."</li>\n";
$suffixe = '.jpg';
}
elseif (substr($signature,0,10) == '89504e470d') {
$image_ok = true;
$info_message = "<li>La signature (".substr($signature,0,10).") de l'image
d'origine ".$this->original_name." atteste que c'est une image .png. Son
type mime annoncé était ".$this->mime_type."</li>\n";
$suffixe = '.png';
}
elseif (substr($signature,0,12) == '474946383961' ||
substr($signature,0,12) == '474946383761') {
$image_ok = true;
$info_message = "<li>La signature (".substr($signature,0,12).") de l'image
d'origine ".$this->original_name." atteste que c'est une image .gif. Son
type mime annoncé était ".$this->mime_type."</li>\n";
$suffixe = '.gif';
}
else {
$warning_message = "<li>!!!ALERTE : Ce fichier n'est pas à format d'image
reconnu par l'application. Son type mime est ".$this->mime_type.".</li>\n";
}
$result[0] = $image_ok;
$result[1] = $info_message;
$result[2] = $warning_message;
$result[3] = $suffixe;
return $result;
} // fin de méthode verifImage
Si ça peut t'aider...
Cordialement
--
Marc