Кэш изображений не отображает новое отредактированное изображение - PullRequest
3 голосов
/ 20 августа 2011

Я строю php-скрипт для написания текстов поверх фонового изображения. Я использовал функции GD, такие как imagecopy(), imagejpeg(), imagedestroy(), чтобы объединить текстовое изображение и фоновое изображение. Все работает отлично. После отправки формы новое изображение будет сохранено в том же имени файла фонового изображения, и поэтому при перезагрузке страницы отредактированное изображение не отображается в браузере. Мне нужно обновить страницу, используя Ctrl + F5 (на окнах), чтобы загрузить отредактированное изображение. Может кто-нибудь помочь мне, как очистить этот кэш?

Ответы [ 2 ]

4 голосов
/ 20 августа 2011

просто добавьте? V = что-то к фоновому пути каждый раз, когда вы редактируете фоновое изображение, это приведет к обновлению

1 голос
/ 20 августа 2011

Для правильной обработки кэширования изображений вы можете написать правила либо в вашей конфигурации apache, либо в htaccess ... либо вы можете создать простой "поставщик изображений", что-то вроде ...

public function img($imgfile = '')
{
    $imgfile = $_GET['q'];
    $age = 60*60*24*31;
    $file = $_SERVER['DOCUMENT_ROOT'].'/'.$imgfile;

    if ( ! file_exists($file))
    {
       header('HTTP/1.0 404 Not Found');
    }
    else
    {
       $last_modified = filemtime($file);

        // Check for cached version
        if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) OR isset($_SERVER['HTTP_IF_NONE_MATCH'])) 
        {
           if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s \G\M\T', $last_modified)) 
           {
               header('HTTP/1.0 304 Not Modified');
               exit;
           }
        }   
        if(strpos($imgfile,'.png') !== FALSE)
        {
            Header('Content-Type: image/png');
        }
        elseif(strpos($imgfile,'.jpg') !== FALSE || strpos($img_file,'.jpeg') !== FALSE)
        {
            Header('Content-Type: image/jpg');
        }
        elseif(strpos($img_file,'.gif') !== FALSE)
        {
            Header('Content-Type: image/gif')
        }

        Header('Last-Modified : '.gmdate('D, d M Y H:i:s \G\M\T', $last_modified));
        Header('Cache-Control : max-age='.$age.', must-revalidate');
        Header('Expires : '.gmdate('D, d M Y H:i:s \G\M\T', $last_modified + $age));
        echo file_get_contents($file);
}

Тогда выможете использовать это в своем теге изображения, например <img src="provider.php?q=foo.jpg" alt="Foo" />

...