如何清除或替换缓存的图像

IT技术 javascript image caching replace
2021-03-17 04:51:41

我知道有很多方法可以防止图像缓存(例如通过 META 标记),还有一些不错的技巧可以确保每次页面加载时都显示图像的当前版本(例如 image.jpg?x=timestamp ),但是有什么方法可以真正清除或替换浏览器缓存中的图像,从而使上述两种方法都不是必需的?

举个例子,假设一个页面上有 100 张图像,这些图像被命名为“01.jpg”、“02.jpg”、“03.jpg”等。如果图像“42.jpg”被替换,是有什么方法可以在缓存中替换它,以便“42.jpg”在连续页面加载时自动显示新图像?我不能使用 META 标记方法,因为我需要替换 ISN"T 的所有内容以保持缓存,而且我不能使用时间戳方法,因为我不希望每次页面都重新加载所有图像负载。

我绞尽脑汁在互联网上搜索了一种方法来做到这一点(最好通过javascript),但没有运气。有什么建议?

6个回答

如果您正在动态编写页面,则可以将最后修改的时间戳添加到 URL:

<img src="image.jpg?lastmod=12345678" ...

在 php 中,我们通常可以使用这样的 rand 函数,<img src="image.jpg?new=<?php rand() ?>">
2021-04-18 04:51:41
这是我觉得最好的答案,因为它仍然允许浏览器缓存。
2021-05-05 04:51:41
怎么样<img src="image.jpg?<?php echo filemtime('image.jpg') ?>",肯定更有活力!
2021-05-09 04:51:41

<meta>完全无关。事实上,您根本不应该尝试使用它来控制缓存(当任何内容读取文档内容时,它已经被缓存了)。

在 HTTP 中,每个 URL 都是独立的。无论您对 HTML 文档做什么,它都不适用于图像。

要控制缓存,您可以在每次 URL 内容更改时更改 URL。如果您不时更新图像,请允许它们永久缓存并为新图像使用新的文件名(带有版本、哈希或日期)——这是长期文件的最佳解决方案。

如果您的图像经常更改(每隔几分钟,甚至在每次请求时),则发送Cache-control: no-cacheCache-control: max-age=xx其中xx是图像“新鲜”的秒数。

短期文件的随机 URL 是个坏主意。它会用无用的文件污染缓存,并强制更快地清除有用的文件。

如果你有Apache和mod_headersmod_expires然后创建.htaccess适当的规则文件。

<Files ~ "-nocache\.jpg">
   Header set Cache-control "no-cache"
</Files>

以上将使*-nocache.jpg文件不可缓存。

您还可以通过 PHP 脚本提供图像(默认情况下它们具有糟糕的可缓存性;)

相反的是一些其他的答案说,有IS的客户端JavaScript的方式来替换缓存图像。诀窍是创建一个 hidden <iframe>,将其src属性设置为图像 URL,等待它加载,然后通过调用location.reload(true). 这将更新图像的缓存副本。然后,您可以替换<img>页面上元素(或重新加载页面)以查看图像的更新版本。

(小警告:如果更新单个<img>元素,并且如果更新图像的图像不止一个,则必须将它们全部清除或删除,然后替换或重置它们。如果您一一执行,某些浏览器会从其他标签复制图像的内存版本,结果是您可能看不到更新的图像,尽管它在缓存中)。

我在这里发布了一些代码来进行这种更新

它不是任何规范的一部分,但 Firefox 和 IE 都支持它。Firefox 仍然支持它,如果您使用的是 Firefox,您确实可以通过此方法强制重新加载缓存。但你是对的,对于其他现代浏览器,你不能。
2021-04-25 04:51:41
与网络上的许多文档所说的相反,没有参数location.reload(). 因此没有办法通过这种方法强制缓存重新加载。MDN上阅读更多信息
2021-04-26 04:51:41

像这样更改图像 url,在查询字符串中添加一个随机字符串。

"image1.jpg?" + DateTime.Now.ToString("ddMMyyyyhhmmsstt");
这实际上不会刷新图像缓存。它只是诱使浏览器认为它是一个新图像。使用这种方法,如果我检查 chrome 缓存,我可以看到 12 个以上的相同图像。在对我的服务器响应上设置缓存控制是一个更好的解决方案,而不是一个黑客。理想情况下,您确实希望浏览器缓存图像,只需在更改时刷新即可。
2021-04-24 04:51:41

我相信大多数浏览器都尊重Last-Modified HTTP 标头。将它们发送出去并请求新图像。如果 Last-Modified 行没有改变,它将被浏览器缓存。