-2

上传文件后出现问题,但页面仍显示上一张图片。我必须刷新页面 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]);'>

}

4

2 回答 2

0

如果您出于自己的测试目的需要它,可以在谷歌浏览器中使用控制台并在此处检查元素:在此处输入图像描述

这将在控制台打开时随时为您禁用缓存(您无需刷新 2-3 次)。

于 2013-09-21T12:53:29.427 回答
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']".

于 2013-09-21T12:55:56.500 回答