web-dev-qa-db-fra.com

PHP exif_read_data Taille IFD illégale

Je travaille sur une application où je corrige l'orientation (si elle est présente) des fichiers JPEG téléchargés à partir d'un compartiment AWS.

Ici vous pouvez vérifier que cette image a une section Exif Rotation.

Je télécharge l'image avec

file_put_contents('/local/path/to/file', file_get_contents('/path/to/url/image'));

Et après avoir essayé de corriger l’orientation à travers le Gregwar Image library .

Image::open($path)->fixOrientation()->save($dest, $type, $quality);

J'ai essayé avec plusieurs images et je reçois toujours le message

Warning: exif_read_data('/local/path/to/file'): Illegal IFD size

Je pensais que c’était un problème lié à la récupération des images, mais j’ai aussi essayé avec cUrl et fopen avec le même résultat.

Quelqu'un a des conseils?

13
stuzzo

PHP 5.6.2x a un bogue avec sa capacité EXIF ​​(voir bogue # 72914 ainsi que # 72819 pour plus d’informations). Toute tentative de lecture de données EXIF ​​entraînera l’une des erreurs décrites (taille IFD non autorisée, données incorrectes IFD, autre).

Pour l'instant (2016-11-21), il n'y a pas de correctif disponible pour la branche 5.6. Des tests sont en cours dans la branche 7.

Implémentez un correctif local en testant la fonction générant des erreurs IFD. Lorsque cela est confirmé, supposez que EXIF ​​n'est pas disponible pendant toute la durée du script.

(Vous pouvez le patcher dans le chargeur si vous le souhaitez et «surcharger» les fonctions pour renvoyer false par défaut/0/null à la place pour indiquer un bris.)

4
Kadigan.KSB

Vous pouvez utiliser un "@" avant pour ignorer les avertissements: @Image::open($path)->fixOrientation()->save($dest, $type, $quality);

Cela fait beaucoup de gens se plaindre à ce sujet sur Internet. Probablement des données exif avec erreur. Si votre opération fonctionne comme vous le souhaitez, il suffit de la documenter et de passer à autre chose.

1
Felippe Duarte

J'ai également rencontré ce problème avec exif_get_data. Je peux gérer les images sur mon hôte local (PHP 5.4.15), mais sur mon hébergeur (PHP 8.6.22), l'erreur 'taille IFD illégale' alors que j'avais déjà essayé la méthode d'alerte Ignorer "@" que sur l'hôte Web (que ce soit en raison d'une version ou d'une installation différente), exif_get_data levait en réalité une exception plutôt que d'émettre un avertissement. J'utilise les données exif pour réorienter l'image si elle a fait l'objet d'une rotation. Par conséquent, si les données exif sont défectueuses ou non présentes, je les ignore et ne fais rien, voici l'extrait de code:

     try {
        $exif = exif_read_data($filePath);
     }
     catch (Exception $exp) {
        $exif = false;
     }
     if ($exif){
        ...
     }
1
Arfon

Dans environnement de production , le mieux est encore de cacher les avertissements!

J'ai donc changé le rapport d'erreur à ERRORS avec la ligne suivante au début de mon script:

error_reporting(E_ERROR);
0
Meloman