上传文件后出现问题,但页面仍显示上一张图片。我必须刷新页面2-3次才能使页面显示正确的图像(新图像)。
我尝试将这些行添加到页面的顶部:
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 08 Nov 2014 05:00:00 GMT");
我也尝试将日期更改为过去。但仍然没有用。
在.htaccess中我也提出:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType image/x-icon "access plus 604800 seconds"
ExpiresByType image/jpeg "access plus 604800 seconds"
ExpiresByType image/png "access plus 604800 seconds"
ExpiresByType image/gif "access plus 604800 seconds"
ExpiresByType application/x-shockwave-flash "access plus 604800 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</IfModule>
没有任何帮助,页面仍然执行相同的操作。每次上传新图片时,我都要刷新页面2-3次。
我该怎么办?
更新
一些PHP行(我有更多但很容易看到我发布重要的行)
$photo=$_FILES['photoA']['tmp_name'];
$photo_name=$_FILES['photoA']['name'];
$photo_size=$_FILES['photoA']['size'];
$photo_type=$_FILES['photoA']['type'];
$uid=$_POST['uid'];
$ext = strtolower(end(explode('.', $photo_name)));
if ($ext == "jpg" or $ext == "jpeg" or $ext=="gif" or $ext=="png") {
$filename=$uid.".".$ext;
copy($photo,"myfolder/$filename");
}
}
///在我的index.php中(获取sql之后)
if ($row['user_img'] !="" ){
echo"<div id='userimg_cont' style='background-image: url(../myfolder/$row[user_img]);'>
}
答案 0 :(得分:0)
如果你需要它用于自己的测试目的,你可以在谷歌浏览器中使用控制台并检查元素:
这将在控制台打开时随时为您禁用缓存(您无需刷新2-3次)。
答案 1 :(得分:0)
不确定它是否有帮助,但这是检查浏览器用户头像的缓存时间的方法,如果文件被修改,我们强制浏览器重新验证。否则,返回304未被修改。
$request_headers = apache_request_headers();
$avatar = 'path/to/user/avatar';
$last_modified = xx; //last modified time of our avatar file
$last_modified_str = gmdate("D, d M Y H:i:s", $last_modified).' UTC';
//Not outdate
if (isset($request_headers['If-Modified-Since']) && strtotime($request_headers['If-Modified-Since']) === $last_modified) {
header('Last-Modified: '.$last_modified_str, true, 304);
//else, outdated
}else{
$info = getimagesize($avatar);
$mime = $info['mime'];
header('Last-Modified: '.$last_modified_str, true, 200);
header('Content-Type: '.$mime);
header('Cache-Control: public, max-age=300');
header('Date: '.gmdate("D, d M Y H:i:s e", time()));
header('Expires: '.gmdate("D, d M Y H:i:s e", time()+300));
header('Content-Disposition: inline; filename="avatar-'.$id.'.jpg"');
readfile($avatar);
}
为什么max-age=300
?这取自gravatar的缓存机制。我们相信他们有理由这样做:)
修改强>
另一种方式,虚拟证明方式,可能正在使用版本,因为每次用户上传图像时,您都会使用?v=some_version_string
附加路径以强制浏览器重新下载文件。
这样做的一种方法可能是使用$the_url_of_the_image.'?v='.filemtime($the_image_path)
。
编辑2
我必须指出的一件事是你的代码很容易受到攻击,但这不是这里的主题。无论如何,试试这个:
if ($row['user_img'] != ""){
$fmtime = filemtime("myfolder/$row['user_img']");
echo "<div id='userimg_cont' style='background-image: url(../myfolder/{$row['user_img']}?v={$fmtime});'>
}
我不知道你在哪里存储你的图像所以我认为它在"myfolder/$row['user_img']"
。