2010-11-12 4 views
0

Si j'appelle: http://localhost/info/imgfeed.php?img=deer.png dans la barre d'adresse IE puis il est bien affiché.PHP écrit PNGs, problème constant dans IE8

Si je créer un lien URL dans un fichier HTML comme ceci:

<img src="imgfeed.php?img=dove.png" alt="" height="" width="" /> 
<img src="imgfeed.php?img=dolphin.png" alt="" height="" width="" /> 
<img src="imgfeed.php?img=deer.png" alt="" height="" width="" /> 

Ensuite, il échoue lamentablement sur IE mais fonctionne très bien sur d'autres navigateurs (testé Chrome/FF dans les versions stables les plus récents). Mon code PHP est la suivante (copie presque mot pour mot du manuel PHP):

<?php 
$server = $_SERVER['DOCUMENT_ROOT']; 
$path = basename(dirname(__FILE__)); 
write_img($server.'/'.$path.'/'.$_GET["img"]); 

function write_img($filename) { 
    $size = getimagesize($filename); 
    if ($size && $fp) { 
    header("Content-type: {$size['mime']}"); 
    header("Cache-Control: no-cache"); 
    header("Expires: -1"); 
    readfile($filename); 
    exit; 
    } else { 
    // error 
    } 
} 
?> 

Toutes les idées sur ce qui se passe serait très apprécié, je l'ai essayé une gamme de tours avec les en-têtes ainsi qu'avec .htaccess (Faire apparaître le fichier PHP comme un fichier PNG) mais rien de tout cela n'a d'effet sur le rendu dans IE qui ne montre finalement que 3 points minuscules (qui peuvent être sauvegardés sous untitled.bmp).

Mise à jour problème résolu avec la permission de Meagar (supprimer largeur/hauteur de HTML et tout est bon). Exemple ci-dessus mis à jour pour refléter les conseils de Marc B sur fpassthru vs readfile.

+0

ummm ... Qu'est-ce que ça fait dans IE que vous dites "échouer lamentablement"? Oh, et vous rendez-vous compte qu'en définissant 'height =" "' et 'width =" "' peut être interprété comme 0 height/width? Si vous voulez qu'ils soient automatiques (en fonction de la taille de l'image), ne les incluez même pas dans les attributs ... – ircmaxell

+0

En plus de cet IE a tendance à ajouter des bordures aux images si vous ne spécifiez pas border = "0" – Dai

Répondre

3

Avez-vous essayé d'oublier les attributs width et height pour votre tag <img>? Le code côté serveur est presque certainement très bien; IE est susceptible d'interpréter width="" comme width="0" et affichant les petits points que vous avez mentionnés.

+0

Merci beaucoup Meagar! Exemple classique de (moi!) Sauter par tous les cerceaux les plus techniques avant de venir à une solution simple. Si je supprime la largeur et la hauteur ou les remplir avec des valeurs correctes, il arrive au même résultat - affichage fonctionnel :) – hjhndr

0

avez-vous essayé d'utiliser

imagepng($output); 

pour le rendu de l'image?

il peut aussi aider à utiliser

ob_clean(); 
flush(); 

avant fpassthru ($ fp); nettoyer le tampon avant le rendu.

+0

s'il vous plaît formater les segments de code dans votre réponse. il y a un bouton au-dessus de la zone de texte pour cela. – stillstanding

+0

désolé le fixait. –

+1

fpassthru est globalement un mauvais choix, car il va charger le fichier entier en mémoire avant de l'envoyer. readfile() est plus approprié, car il va lire/envoyer des morceaux. De plus, utiliser imagepng() signifierait d'abord décompresser l'image en mémoire, puis la recompresser pour la sortie. Cela peut corriger les mauvaises données dans l'image source, mais va aspirer la mémoire comme un fou et mettre une lourde charge sur le serveur. –

1

Vous pouvez essayer d'ajouter quelques autres têtes qui semblent parfois pour résoudre les problèmes IE:

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

Mais comme meagar dit, IE6 n'aime pas la largeur en blanc et les attributs de hauteur, et nécessite toujours une valeur là-dedans.

+0

L'exemple fonctionne avec les en-têtes actuellement définis, mais je les garderai à l'esprit en cas de problèmes lors de l'implémentation de ce code dans l'application sur laquelle je travaille. Ce n'est pas juste IE6 qui n'aime pas la largeur et la hauteur vierges, il est maintenant prouvé au-delà de tout doute que IE8 est aussi détraqué. – hjhndr

+0

Heureux que vous l'ayez corrigé - on dirait que je peux rejoindre le club de saut d'obstacles dans le trop technique-explications :-) – hollsk