PHP 强制刷新图片

13
我正在创建一个输入表单,允许用户上传图像。一旦提交后,用户将返回到该表单,页面顶部会有一个确认信息。
任何已提交的图像都将通过查询MySQL数据库来预览,该数据库存储图像的URL。但是,如果用户上传一张照片,预览后又决定更改该照片并重新提交表单,在带您回到表单时,除非手动在浏览器上按“刷新”按钮,否则新照片不会显示出来。
是否有任何方法可以强制刷新/删除缓存或针对特定图像进行刷新,而不是整个页面?
谢谢
5个回答

31
将修改日期作为查询参数添加到图像的末尾。
<img src="/images/photo.png?=1239293"/>

在PHP中

<img src="/images/photo.png?=<?php echo filemtime($filename)?>"/>

你会建议使用什么函数来生成时间戳? - DorianHuxley
2
我刚刚添加了一个问号,当我欺骗浏览器重新加载时,没有任何时间戳。 - bestprogrammerintheworld
1
如果图像存储在硬盘上,那么您可以使用filemtime的整数结果。即使覆盖旧的图像文件,它也能正常工作。http://php.net/manual/en/function.filemtime.php - Reactgular
1
需要注意的一件事是,在服务器级别未配置缓存头的情况下,存在“?”可能会改变浏览器的默认假设,从“缓存一段时间,因为它是图像”变为“永不缓存,因为它有查询字符串”。这对于这种情况来说是可以接受的,但并不总是预期的结果。 - IMSoP

14

在 PHP 中,你可以发送一个随机数或当前时间戳:

<img src="image.jpg?<?=Date('U')?>">
或者
<img src="image.jpg?<?=rand(1,32000)?>">

这在我的脚本中曾经有效,但现在不再起作用了。唉。 - Nova
没有理由不起作用,除非你使用代理缓存并忽略 URL 参数。 - Arvy

4
这里的技巧是告诉浏览器不要缓存内容。您可以在任何其他内容之前(没有空格或任何东西!)放置以下语句来实现:不缓存。
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

根据您加载图像的方式,您还可以使用jQuery对图像进行javascript刷新。


1
-1,不要在图像头部禁用缓存。这将强制每次页面加载时下载图像。 - Reactgular
这将使浏览器不缓存页面上的内容。性能会下降,但不是非常明显;然而,如果页面上有很多图像,则可能会显著下降。 - Christian Stewart
@MathewFoscarini 他希望图片在每次页面加载时都能下载。 - Christian Stewart
如果您只想使用JavaScript刷新图像,可以使用以下代码:https://dev59.com/DnI95IYBdhLWcg3w5SSh - Christian Stewart
@ChristianStewart,不,他希望在图片发生变化时进行下载。 - Reactgular
@DorianHuxley,就性能而言,这并没有什么用。这与根本不使用缓存是一样的。这是浏览器缓存的服务器端控制。了解头文件及其功能是很酷的事情。 - m3nda

0

您可以使用JavaScript将当前图像替换为新图像:

    <div id="imageHolder">this is where the image will show</div>
    <script type="text/javascript">
    function myfunction(){
    document.getElementById("imageHolder").innerHTML="<div id=\"imageHolder\"><img src='imagefolder/imagename.jpg' alt=''/></div>";
    }</script>

在完成课程上传后,您需要触发函数myfunction。


0

这对我非常有效:

image.jpg?=<?php echo rand() . "\n";?>

谢谢你的回答,虽然我大约4年前就已经解决了:P - DorianHuxley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接