Как управлять кэшированием контроля изображений Flex 3

Согласно документам Adobe Flex: http://livedocs.adobe.com/flex/3/html/help.html?content=controls_15.html

Использование изображения несколько раз

Вы можете использовать одно и то же изображение несколько раз в своем приложении, используя каждый раз обычный синтаксис импорта изображений. Flex загружает изображение только один раз, а затем ссылается на загруженное изображение столько раз, сколько необходимо.

Однако в ходе тестирования мы обнаружили, что если вы запрашиваете одно и то же изображение (тот же URL-адрес и т. Д.) В IE flash 9/10, новый http-запрос не будет выдан, но в Firefox, Safari (ПК и MAC) новый запрос будет всегда выдается.

Я хочу, чтобы изображение не вытаскивалось с сервера каждый раз, когда я пытаюсь его использовать. У кого-нибудь есть идеи, почему это работает только в IE?

6 ответов

Одним из обходных путей является создание собственного кэша изображений с помощью ActionScript путем сохранения BitMapData исходного экземпляра и использования его в качестве источника для последующих экземпляров:

private var image1:Image = new Image();    
private var image2:Image = new Image();                 

private function init() : void
{
    image1.addEventListener(Event.COMPLETE, onComplete);
    image1.source = "icon.png";
    addChild(image1);   
}


private function onComplete(event:Event) : void
{   
    var image:Image = event.target as Image;                
    var bitmapData:BitmapData = new BitmapData(image.content.width,
                                               image.content.height, true);    
    bitmapData.draw(image.content);         
    image2.source = new Bitmap(bitmapData);
    addChild(image2);
}

Я создал полностью работающий пример и разместил источник здесь.

Вот ответ: НИКОГДА не думайте, что IE делает это правильно. IE был не прав, все остальные браузеры были верны. Файлы.swf возвращались с Cache-control: частный заголовок. IE не должен был возвращать кэшированное изображение. Правильная установка заголовка Cache-Control привела к тому, что все браузеры работают должным образом.

Лучший способ загрузить изображение один раз и затем многократно использовать его в приложении Flex - это встроить изображение и связать его с представлением класса, а затем просто ссылаться на этот класс.

Пример:

[Embed(source="myImage.jpg")]
[Bindable]
public var myImageClass:Class;

НТН

Я также успешно загрузил Image, а затем повторно использовал его свойство source:

<mx:Image id="myImage" source='blah.png'/>

var myNewImage:Image = new Image();

myNewImage.source = myImage.source;

На самом деле вопрос не в том, как кэшировать изображение, а в том, почему IE использует изображение в кэше браузера, а FF, Safari, Chrome и т. Д. Не используют? (IE7 кстати).

Я все еще пытаюсь придумать пример приложения разумного размера. У нас есть холст с mx:Image или mx:SWFloader. Холст воссоздается, однако URL-адрес изображения идентичен, поэтому браузер должен возвращать кэшированное изображение и не выдавать другой запрос на него. Очень простой пример просто mx:Image, где вы устанавливаете источник, очищаете источник и сбрасываете источник, правильно использует кэшированное изображение во всех браузерах.

Проблема заключается в сроке действия ваших изображений. Настройте на сервере приложений политику истечения срока действия изображений, и кэш работает нормально во всех браузерах.

Другие вопросы по тегам