2010-10-04 6 views
3

J'ai une fonction en PHP qui appelle curl pour récupérer une image. Lorsque j'imprime cela dans un fichier et que je l'examine dans le navigateur, l'image est superbe. Lorsque j'utilise "echo" des résultats de la boucle comme valeur de retour de mon script PHP, le navigateur affiche l'icône de l'image brisée (voir un exemple de cette icône: http://www.artifacting.com/blog/wp-content/uploads/2007/01/error_icon.gif).PHP écho image JPEG échoue, mais l'écriture même image au fichier fonctionne très bien. Pourquoi?

$ch = curl_init(); 
$options = array(
    CURLOPT_CONNECTTIMEOUT => 120, 
    CURLOPT_TIMEOUT  => 120, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_FRESH_CONNECT => 1, 
    CURLOPT_HEADER   => 0, 
    CURLOPT_USERAGENT  => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)", 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_HTTPPROXYTUNNEL => 1, 
    CURLOPT_POST   => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_BINARYTRANSFER => 1, 
); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt_array($ch, $options); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $param_list); 

// The http response code is 200, and the body length is 50kb. 
$body = curl_exec($curl_params); 

// This produces a file containing an image that looks good when viewed in a browser. 
$bodyFile = @fopen("img.jpg", "w"); 
fprintf($bodyFile, "%s", $body. "\n"); 
fclose($bodyFile); 

// This does not render in the browser. Instead I see the broken image icon. 
$contentType = "image/jpeg"; 
header('Content-type: ' . $contentType); 
echo $body; 

Des idées? Aidez-moi!

+5

Vérifiez que rien n'a été accidentellement échoué avant ou pendant le réglage de l'en-tête. – BoltClock

+0

alors l'image ne serait pas cassée, il obtiendrait une vieille erreur plaine msg – Hannes

+1

En fait, il n'obtiendrait pas un message d'erreur. Il obtiendrait une chaîne de charabia que le navigateur interprète l'image comme ASCII – stevendesu

Répondre

1

Il s'est avéré que j'avais un autre fichier PHP qui écrivait un caractère de nouvelle ligne supplémentaire. Il y avait une nouvelle ligne à la fin de ce fichier après la ligne "?>".

+0

Sur une note de côté, c'est pourquoi certains projets PHP ont institué la pratique que?> Est de être omis à la fin des fichiers pour éviter ce genre de problème. –

2

Veuillez vous assurer de définir les bons paramètres cURL.

Cet exemple fonctionne très bien pour moi:

<?php 
$ch = curl_init ("http://www.google.com/images/logos/ps_logo2.png"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
$image=curl_exec($ch); 
curl_close ($ch); 
header("Content-Type: image/png"); 
echo $image; 
?> 
2

La réponse dépend de ce que vous entendez par « cassé ». Si la moitié supérieure de l'image apparaît mais que la moitié inférieure ne l'est pas, vous avez une mauvaise version dans votre cache à partir d'un paquet abandonné (cache vide, rafraîchir, réessayer) ou le script est interrompu prématurément. trop de ressources ou de courir trop longtemps. Si le vidage du cache ne résout pas le problème, vérifiez les paramètres de php.ini et voyez si l'augmentation du temps de vie du script ou de la mémoire max résout le problème.

Si l'image est un tas d'ASCII insignifiant, vous avez renvoyé quelque chose ou envoyé un en-tête avant ce point dans votre code. La cause invisible la plus commune de ceci est d'avoir une seule ligne vide avant votre <?php en haut de la page. Assurez-vous qu'il n'y a pas un seul octet (même non-imprimable!) Avant le <?php si c'est le cas.

Si l'image est définitivement un fichier image, mais qu'elle est statique, une boîte grise, des couleurs aléatoires, etc. - alors c'est un problème avec le type de contenu. Essayer d'analyser une image JPG en tant que PNG produira parfois une boîte grise ou d'autres images aléatoires "d'échec".

+0

En cassé, je veux dire que je reçois l'icône de l'image brisée dans mon navigateur. (Cette icône: http://www.artifacting.com/blog/wp-content/uploads/2007/01/error_icon.gif) – eggplant

Questions connexes