Is there a way to force browsers to refresh/download images?

HtmlBrowserBrowser CacheImage Caching

Html Problem Overview


I have a problem where users are reporting that their images aren't being uploaded and the old ones are still there. On closer inspection the new images are there, they just have the same name as the old one. What I do on the upload is that I rename the images for SEO purposes. When they delete an image the old index becomes available and is reused. Therefore it has the same image name.

Is there a way to (i thought maybe there might be a meta tag for this) to tell the browser to not use its cahce?

The better answer is to rename the image to something totally new. I will get working on that but in the mean time is the quick solution while I work on the bigger problem.

Html Solutions


Solution 1 - Html

Append a query string with an arbitrary unique number (or time, or version number, etc.):

<img src="image.png?80172489074" alt="a cool image" />

This will result in a new request, because of the different URL.

Solution 2 - Html

It's tough. You really want images to be cached, but then you don't want to cache them once a new ones available:

  • Using expires header with a date in the past prevents any caching. Bad
  • Adding a "cache busting" parameter ?342038402 can fix the problem, but can also prevent the image ever from being cached, which is not what you want. Bad.
  • Using expires header with a short (lets say 1 hr) expires is better... after an hour the user will see the image, but your web server won't have to serve it every time. Compromise, but what time works? Not really feasible.

The solution? I can think of two good options:

  • Look into eTags, and your ability to use them. These are designed for this situation. The browser will explicitly ask your server whether the file is up-to-date or not. You can just turn this on in apache if you don't have it aleady.
  • Create a new URL for each new image (and use a far-future expires header). This is what you are working on.

Solution 3 - Html

My favourite PHP solution:

<img src="<?php echo "image.jpg" . "?v=" . filemtime("image.jpg"); ?>" />

every change of file "create" a new version of the file

Solution 4 - Html

Append the current datetime to the image src:

<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" />

Solution 5 - Html

You can put http-equiv in <meta> tag which will tell browser not to use cache (or even better -- use it in some defined way), but it is better to configure server to send proper http cache headers. Check out article on caching.

Still, some browsers might not support all of http standard, but I believe it's the way to go.

Solution 6 - Html

Go Random. Just use some random number and append it with image filename.

<img src="image.jpg?<?=rand(1,1000000)?>">

Solution 7 - Html

Another powerfull solution:

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

This print the "last-modification-timestamp" on the path.

New version --> Download new image

Same version --> Take cache's one

Solution 8 - Html

you can control the cache behaviour by playing with the HTTP headers.

setting the expires header in past would force browser to not use cached version.

Expires: Sat, 26 Jul 1997 05:00:00 GMT

You can consult the RFC to have more details.

Solution 9 - Html

If you look at the data that is exchanged between your browser and the server, you'll see that the browser will send a HTTP HEAD request for the images. The result will contain the modification time (but not the actual image data). Make sure that this time changes if the image changes on the server and the browser should download the image again.

Solution 10 - Html

in PHP you can use this trick

<img src="image.png?<?php echo time(); ?>" />

The time() function show the current timestamp. Every page load is different. So this code deceive the browser: it read another path and it "think" that the image is changed since the user has visited the site the last time. And it has to re-download it, instead of use the cache one.

Solution 11 - Html

It sounds like the concern is more about the primary user seeing their new image than cache being disabled entirely? If that's the case, you can do the following:

var headers = new Headers()
headers.append('pragma', 'no-cache')
headers.append('cache-control', 'no-cache')

var init = {
  method: 'GET',
  headers: headers,
  mode: 'no-cors',
  cache: 'no-cache',
}

fetch(new Request('path/to.file'), init)

If you do this after a new image is uploaded, the browser should see those headers and make a call to the backend, skipping the cache. The new image is now in cache under that URL. The primary user will see the new image, but you still retain all the benefits of caching. Anyone else viewing this image will see updates in a day or so once their cache invalidates.

If the concern was more about making sure all users see the most up to date version, you would want to use one of the other solutions.

Solution 12 - Html

In PHP you can send a random number or the current timestamp:

<img src="image.jpg?<?=Date('U')?>">

or

<img src="image.jpg?<?=rand(1,32000)?>">

Solution 13 - Html

that was not ok result, I think this is the way to program it correct.

 <td><?php echo "<img heigth=90 width=260 border=1 vspace=2 hspace=2 src=".$row['address']."?=".rand(1,999)."/>" ?></td>

Solution 14 - Html

I had come up with this issue some times ago. And I was getting data through JSON in AJAX. So what I did is, I just added a Math.random() Javascript function and It worked like a charm. The backend I used was a flask.

<img class="card-img-top w-100 d-block" style="padding:30px;height:400px" src="static/img/${data.image}?${Math.random()} ">

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionuriDiumView Question on Stackoverflow
Solution 1 - HtmlknittlView Answer on Stackoverflow
Solution 2 - HtmlndpView Answer on Stackoverflow
Solution 3 - HtmlGianluca DemarinisView Answer on Stackoverflow
Solution 4 - HtmlRob VandersView Answer on Stackoverflow
Solution 5 - HtmlsamuilView Answer on Stackoverflow
Solution 6 - HtmlstackFanView Answer on Stackoverflow
Solution 7 - HtmlGianluca DemarinisView Answer on Stackoverflow
Solution 8 - HtmlRageZView Answer on Stackoverflow
Solution 9 - HtmlAaron DigullaView Answer on Stackoverflow
Solution 10 - HtmlGianluca DemarinisView Answer on Stackoverflow
Solution 11 - HtmlBen MathesonView Answer on Stackoverflow
Solution 12 - HtmlArvyView Answer on Stackoverflow
Solution 13 - HtmltijntestView Answer on Stackoverflow
Solution 14 - HtmlManish MeshramView Answer on Stackoverflow