PROJET AUTOBLOG


Warrior du Dimanche

Site original : Warrior du Dimanche

⇐ retour index

PHP: “JPEG library reports unrecoverable error: Not a JPEG file: starts with 0x89 0x50” Error Solved – An Exploring South African

mercredi 22 juin 2022 à 14:37

Tiens, je ne savais pas que la bibliothèque GD avait une fonction imagecreatefromstring() qui permet de créer une ressource image à partir d'une chaîne.

C'est très utile dans le cas où on récupère une image via une URL sur un site et qu'on veut lui appliquer un traitement.

En effet, quand on veut faire ça «normalement», on a recours à imagecreatefrom[FORMAT] (imagecreratefromPng() par exemple), ce qui oblige à connaître l'extension ou au moins le type mime de l'image... et des fois, ça couille : l'URL ne contient pas l'extension ou alors il y a des paramètres GET dedans, bref, ça fait chmir.

Avant, je partais vers la récupération de l'extension du fichier pour appeler la fonction adaptée... c'est chiant, sale et pas parfait comme solution (bugs de nom et besoin de télécharger localement l'image sous forme de fichier)

$downloaded_pic=file_get_contents($url);
file_put_contents($local_path_pic,$downloaded_pic);
$ext=pathinfo($url)['extension'];
$fun=$ext=='jpg'?'jpeg':$ext;
$function_name='imagecreatefrom'.$fun;
$img  = $function_name($local_path_pic);

Heureusement

Avec imagecreatefromstring(), ça passe tout seul, c'est plus propre, plus lisible et surtout, pas besoin du type de l'image ou d'un fichier local...


if ($downloaded_pic=file_get_contents($url)){
    $image=imagecreatefromstring($downloaded_pic);
}else{
    exit("Erreur de téléchargement de l'image");
}

On peut même récupérer les dimensions de l'image avec un équivalent de getimagesize() : getimagesizefromstring() !

<link rel="stylesheet" href="http://www.warriordudimanche.net/./plugins/Galart/style.css"/> <link rel="stylesheet" href="http://www.warriordudimanche.net/./plugins/Galart/assets/lightbox.css"/> <script src="http://www.warriordudimanche.net/./plugins/Galart/assets/lightbox.js"> <script>[].forEach.call(document.querySelectorAll("[lightbox]"), function(el) { el.lightbox = new Lightbox(el);});

► Commentaires