Как очистить кэш изображений после редактирования изображения на моем сайте?


Я использую внешнюю страницу для обновления образа в моей системе. Когда меня перенаправляют обратно на страницу, на которой я работал, я все еще вижу старую картинку. Я не вижу своих изменений, пока не нажму ctrl+f5. Есть ли у них какой-либо способ перенаправить с историей delete или любое другое решение?

3   8   2010-12-21 03:34:00

3 ответа:

Добавьте строку запроса к источнику изображения, это предотвратит кэширование браузера. Некоторые люди используют дату, я предпочитаю GUID

Guid g = Guid.NewGuid();
string GuidString = Convert.ToBase64String(g.ToByteArray());
GuidString = GuidString.Replace("=", "");
GuidString = GuidString.Replace("+", "");

Image1.ImageUrl = "/path/to/new/image.jpg?r=" + GuidString;

В итоге ваш Источник изображения будет выглядеть примерно так:

 <img src="/path/to/image.jpg?r=Vqad3W8ZUG6oXgFzZIw" id="Image1" runat="server" />

Решение об обновлении или нет зависит от браузера. Стандартный метод решения этой проблемы-добавление метки времени к вашим изображениям. Например:

<img src='/images/foo.jpg?ts=1'/>

Когда вы обновите изображение, отправьте назад:

<img src='/images/foo.jpg?ts=2'/>

Браузер увидит два разных URL и запросит изображение снова. Вы можете использовать метку времени (время последнего изменения файла), хэш содержимого файла, увеличивающееся целое число,... Все, что угодно, чтобы изменить URL и заставить браузер перезагрузиться.

N. B. При подаче статические файлы, веб-серверы будут игнорировать строку запроса. Так что вам не нужен никакой код, запущенный для реализации этого. Этот метод также хорошо работает для любого контента, который вы хотите принудительно обновить, включая CSS, JS, ...

В C# есть гораздо более простой способ. вы устанавливаете bitmapimage CreateOptions в BitmapCreateOptions.IgnoreImageCache, и это заставляет изображение загружаться из файла вместо использования существующего кэша.

        var bi = new BitmapImage();

        StorageFile file = await StorageFile.GetFileFromPathAsync(filepath);
        const uint requestedSize = 400;
        const ThumbnailMode thumbnailMode = ThumbnailMode.PicturesView;
        const ThumbnailOptions thumbnailOptions = ThumbnailOptions.ResizeThumbnail;

        StorageItemThumbnail thumbnail = await file.GetThumbnailAsync(thumbnailMode, requestedSize, thumbnailOptions);

        bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        bi.DecodePixelHeight = 200;
        bi.DecodePixelWidth = 200;
        bi.SetSource(thumbnail);
        return bi;