Comme les gens l'ont déjà constaté, lorsque vous tentez de charger un fichier dans Imagick qu'il ne peut pas gérer pour une raison quelconque, il lancera une exception qui ne peut pas être interceptée.Gestion des images inconnues avec imagick
J'ai créé un fichier ICO et tenter de le charger en utilisant readImageFile():
$image = new imagick();
$handle = fopen('icon.ico', 'rb');
$image->readImageFile($handle);
Cela jette:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'no decode delegate for this image format `' @ error/constitute.c/ReadImage/501'
Quand je précise l'image sera un fichier ICO, cela fonctionne . Donc, ce code fonctionne très bien:
$image = new imagick();
$image->setFormat('ICO');
$handle = fopen('icon.ico', 'rb');
$image->readImageFile($handle);
En utilisant readFile au lieu de readImageFile, il semble apparemment à l'extension, car ce code fonctionne aussi très bien:
$image = new imagick();
$image->readimage('icon.ico');
Cependant, quand je Renommez le fichier ICO à l'icône .jpg et exécutez ceci:
$image = new imagick();
$image->readimage('icon.jpg');
Il échoue avec l'erreur suivante:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'Not a JPEG file: starts with 0x00 0x00 `icon.jpg' @ error/jpeg.c/JPEGErrorHandler/322'
Le code suivant, cependant, gère le fichier ICO renommé icon.jpg fin:
$image = new imagick();
$image->setFormat('ICO');
$handle = fopen('icon.jpg', 'rb');
$image->readImageFile($handle);
Il est évident que la meilleure façon de gérer les images est de ne pas regarder l'extension, ce qui pourrait être quelque chose, mais regardez au fichier réel. Imagick ne parvient apparemment pas à faire cela. Nous avons des fonctions PHP telles que mime_content_type(), getimagesize() et finfo_buffer() (que PHP.net recommande je pense). Mais ils renverront quelque chose comme "image/x-icon", que la fonction setFormat() ne prendra pas.
Quelle serait la meilleure façon de procéder?
Nice, Merci pour votre réponse! Malheureusement, ce ne sont pas seulement les fichiers ICO que je dois autoriser, mais tout un tas. J'ai convaincu le client de composer une liste blanche. J'espérais que finfo_buffer était suffisamment infaillible. Maintenir ma propre liste de signatures de 4 octets pour tout un tas de types de fichiers ne semble pas idéal. Je souhaitais juste que Imagick ne rate pas si spectaculairement chaque fois qu'il ne peut pas détecter le bon type de fichier. –
Il est peut-être temps de réévaluer l'architecture de la solution. Vous devriez faire l'effort de passer le nom de fichier original 'Imagick'. Il est également très courant que des exceptions soient déclenchées, de sorte que l'application devrait être en mesure d'anticiper et de gérer ces exceptions. – emcconville
Je ne suis pas sûr de pouvoir faire confiance au nom de fichier original, car je ne fais pas confiance à mes utilisateurs. Comme je comprends de cette question, quand Imagemagick jette une erreur fatale, il n'y a pas grand-chose que vous pouvez faire pour l'attraper: https://stackoverflow.com/questions/28156447/how-do-i-catch-an-imagick-fatal -error-in-php –