145 votes

Comment faire pour forcer un navigateur web, ne PAS mettre en cache les images

Arrière-plan

Je suis en train d'écrire et d'utiliser un de très simple basé sur CGI (Perl) outil de gestion de contenu pour les deux pro-bono sites web. Il fournit à l'administrateur du site avec les formulaires HTML pour les événements où ils remplir les champs (date, lieu, titre, description, liens, etc...) et de l'enregistrer. Sur ce formulaire, j'permettre à l'administrateur de télécharger une image liée à l'événement. Sur la page HTML de l'affichage de la forme, je suis également afficher un aperçu de l'image en ligne (balise HTML < img>).

Le Problème

Le problème se produit lorsque l'administrateur veut changer l'image. Il serait juste de frapper le bouton "parcourir", sélectionnez une photo et appuyez sur ok. Et cela fonctionne bien.

Une fois l'image téléchargée, mon back-end CGI gère l'upload et recharge le formulaire correctement.

Le problème est que l'image affichée ne pas vous rafraîchir. L'ancienne image est toujours montré, même si la base de données contient l'image de droite. J'ai rétréci vers le bas pour le fait que l'IMAGE EST mis en CACHE dans le navigateur web. Si l'administrateur frappe le bouton RECHARGER de Firefox/Explorer/Safari, tout est actualisé fine et la nouvelle image s'affiche.

Ma Solution Ne Fonctionne Pas

J'essaye de contrôler le cache en écriture du HTTP Expiration de l'instruction à une date très loin dans le passé.

Expires: Mon, 15 Sep 2003 1:00:00 GMT

Rappelez-vous que je suis sur le côté administratif et je ne m'en soucie pas vraiment si les pages prend un peu plus de temps à charger, car ils sont toujours expiré.

Mais, cela ne fonctionne pas non plus.

Notes

Lors du téléchargement d'une image, son nom n'est pas conservé dans la base de données. Il est renommé comme Image.jpg (simplement les choses lors de son utilisation). Quand remplacer l'image existante par une nouvelle, le nom ne change pas non plus. Juste le contenu de l'image des modifications de fichiers.

Le serveur web est fourni par le service d'hébergement/fournisseur de services internet. Il utilise Apache.

Question

Est-il un moyen pour forcer le navigateur web pour ne PAS mettre en cache les choses à partir de cette page, même pas les images?

Je suis en jonglant avec l'option à fait "enregistrer le nom de fichier" avec la base de données. De cette façon, si l'image est modifiée, le src de la balise IMG vont également changer. Toutefois, cela exige beaucoup de changements dans l'ensemble du site et j'ai plutôt de ne pas le faire si j'ai une meilleure solution. Aussi, ce ne sera toujours pas fonctionner si la nouvelle image téléchargée a le même nom (par exemple l'image est retouchée un peu et re-téléchargé).

217voto

epochwolf Points 6329

Armin Ronacher a la bonne idée. Le problème est aléatoire chaînes peuvent entrer en collision. Je voudrais utiliser:

<img src="picture.jpg?1222259157.415" alt="">

où "1222259157.415" est à l'heure actuelle sur le serveur. (Note: j'ai utilisé python.time() pour générer)

49voto

Armin Ronacher Points 16894

Solution Simple: Fixer un hasard chaîne de requête à l'image:

<img src="foo.cgi?random=323527528432525.24234" alt="">

Ce HTTP RFC dit:

Cache-Control: no-cache

Mais cela ne fonctionne pas bien :)

31voto

Rick Points 31

J'utilise PHP du fichier modifié en fonction de temps, par exemple:

echo <img  src='Images/image.png?" . filemtime('Images/image.png') . "'  />";

Si vous modifiez l'image, puis la nouvelle image est utilisée plutôt que la mise en cache, en raison des différents modifié timestamp.

18voto

x-yuri Points 616

Je voudrais utiliser:

<img src="picture.jpg?20130910043254">

où "20130910043254" est l'heure de modification du fichier.

Lors du téléchargement d'une image, son nom n'est pas conservé dans la base de données. Il est renommé comme Image.jpg (simplement les choses lors de son utilisation). Quand remplacer l'image existante par une nouvelle, le nom ne change pas non plus. Juste le contenu de l'image des modifications de fichiers.

Je pense qu'il y a deux types de solutions simples: 1) ceux qui viennent à l'esprit en premier (simple des solutions, parce qu'ils sont faciles à trouver), 2) ceux qui vous vous retrouvez avec de après avoir à penser à des choses plus (parce qu'ils sont faciles à utiliser). Apparemment, vous n'aurez pas toujours un avantage si vous avez choisi de réfléchir à la situation. Mais la deuxième est plutôt sous-estimé, je crois. Il suffit de penser pourquoi php est si populaire ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X