[résolu] Problème image dynamique avec IE

Petit nouveau ! | 4 Messages

10 juil. 2006, 16:34

Voila, je suis le programmeur d'un petit site codé en iframes.

Sur ce site, je propose la création de signatures au format PNG a partir du choix d'un fond pour la signature puis dans une nouvelle page php je créé cette image, l'affiche et donne la possibilité de changer la couleur de certaines partie du texte.

Le formulaire est validé par la même page php qui affiche et valide.

Sous Mozilla Firefox, l'image se met bien à jour et se "recharge" bien après chaque modification.

Sous internet explorer, je suis obligé de faire un "refresh" manuel et aussi de renvoyer en même temps le contenu de mon formulaire pour afficher correctement la bonne image. Ce n'est vraiment pas pratique.

En cherchant un peu, j'ai vu que le problème venait du fait que le nom de de mon image ne changeait pas et que le cache de IE voyant cela, ne rechargeait pas l'image.

Qualqu'un aurait il une idée, est ce que je m'y prend de la mauvaise facon?

Je suis a votre écoute si vous voulez des détails.
Modifié en dernier par golgy le 11 juil. 2006, 09:38, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2006, 17:05

Je ne pense pas que ce soit une question de nom d'image, mais d'avantage de cache de IE. Par défaut il va regarder dans son cache voir s'il trouve l'image demandé et puisque celle-ci doit avoir à peine quelques secondes, il l'utilise sans se soucier de savoir s'il y en a une nouvelle en ligne (cela dit, ca tombe bien, c'est à ça que sert un cache ;))

Côté navigateur, tu peux modifier les paramètres du cache pour lui dire de vérifier s'il existe une version plus récente à chaque visite, mais difficile de le demander à tous les utilisateurs de ton site.

En revanche, tu peux regarder du côté de la fonction header() pour les paramètres "Cache-Control" ou "Expires" (doit y en avoir encore un ou deux) en spécifiant no-cache etc. pour qu'ils prennent le navigateur entre 4 yeux pour lui faire comprendre qu'il doit toujours venir chercher le dernier fichier :)

Petit nouveau ! | 4 Messages

10 juil. 2006, 17:11

Je suis bien allé voir de ce coté la en mettant dans mon index.php en tout debut de fichier:

Code : Tout sélectionner

<?php header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past ?>
Mais cela ne change rien...

Eléphant du PHP | 332 Messages

10 juil. 2006, 17:41

C'est un cas classique.
Si tu essayes d'afficher une image dynamique, par exemple
<img src="image.php?signature=<? echo $nom; ?>">
elle est mise en cache local par IE et tu auras beau mettre tous les pragma et no-cache que tu veux, ça n'y changera rien.
Il faut que le nom de l'image soit différent à chaque fois, comme ça IE ne la retrouve pas dans son cache et elle est donc réaffichée à chaque fois
<img src="image.php?signature=<? echo $nom; ?>&dummy=<? echo microtime() ; ?>">
ou un random quelconque en paramètre. Bien sûr ce paramètre n'est pas utilisé dans ton calcul d'image, mais pour IE l'image image.php?signature=albert&dummy=123456789 est différente de l'image image.php?signature=albert&dummy=987654321 et donc il va la chercher sur le serveur à chaque fois.

J'ai eu également le cas avec une fenêtre popup avec les mêmes paramètres, mais qui selon le contexte d'où elle est appelée affiche des choses différentes. Je ne me rappelle plus pourquoi on ne pouvait pas passer ce contexte en paramètre et le seul moyen que l'on avait pour que la fenêtre soit recalculée à chaque fois, c'était d'envoyer un paramètre random à la ppopup.
Modifié en dernier par Henri le 10 juil. 2006, 17:52, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2006, 17:46

Tu peux essayer d'ajouter ces deux là en plus des tiens :
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past 

header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
header('Pragma: no-cache'); 
Mais il se peut effectivement que cela ne fonctionne pas avec les images... la solution d'Henri me semble bien :)

Eléphant du PHP | 88 Messages

10 juil. 2006, 18:03

Salut!

J'avais le même problème et je suis passé par ceci:
<?
if (file_exists("images/gantt.png")){
	echo ('<img src="images/gantt.png?' .time(). '">');
}
?>
Bon courage

Petit nouveau ! | 4 Messages

11 juil. 2006, 09:22

Je vais essayer ca, je vous tiens au courant, merci à tous. :)

Petit nouveau ! | 4 Messages

11 juil. 2006, 09:38

La solution toute simple de leakcim51 fonctionne à merveille, merci encore. :D