Play Framework и кеширование изображений - PullRequest
1 голос
/ 21 декабря 2011

В моем шаблоне есть немного кода, подобного этому:

#{list people, as:'person'}
    <img src="@@{Application.image(person.id)}">
#{/list}

После запуска сервера воспроизведения в списке отображается первое изображение несколько раз.Так, например, если переменная people содержит идентификаторы 1, 2, 3, 4, 5 - тогда будет показано пять изображений, но все они одного и того же: это изображение, соответствующее идентификатору 1.

Если я нажму кнопку обновить, все изображения изменятся на уникальные в зависимости от их идентификаторов.HTML-код из шаблона выглядит следующим образом:

<img src="http://url/application/image?personId=1"/>
<img src="http://url/application/image?personId=2"/>
<img src="http://url/application/image?personId=3"/>
<img src="http://url/application/image?personId=4"/>
<img src="http://url/application/image?personId=5"/>

Как я могу запретить шаблону показывать одно и то же изображение в первый раз?

Редактировать: Также пробовалдобавление заголовков ответов, показанных ниже, до вызова renderBinary (image) в моем контроллере, который отвечает на запрос src:

...
response.setHeader("Pragma-directive", "no-cache");
response.setHeader("Cache-directive", "no-cache");
response.setHeader("Cache-control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
renderBinary(imageFile);

согласно этой записи .Фактически это работало первые пару раз, но затем, в третий раз после остановки и запуска сервера Play, у меня возникла та же проблема с кэшированием, когда все изображения показывали одно и то же изображение, несмотря на разные идентификаторы персон.Я также безуспешно добавил метку времени в конец URL.

Редактирование # 2: Я также попытался изменить свойство http.cacheControl на 0 в application.conf:

http.cacheControl=0

Но это снова дало мне непоследовательные результаты относительно того, показали ли это правильные или неправильные изображения.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Я не уверен, что это жизнеспособное решение, но сейчас у меня есть обходной путь, который, кажется, работает (ну, пока он мне не удался), выполнив следующие действия:

  • Установить элемент управления кэшем до вызова renderBinary (...) в контроллере

    response.setHeader("Cache-Control", "no-cache");

  • Преобразуйте файл, который вы отображаете, в FileInputStream и передайте его методу renderBinary (...) вместо файла напрямую.

Как это:

File fileImage = ... // some .png image
FileInputStream stream = new FileInputStream(fileImage);
renderBinary(stream);

Я получил представление об этом отчете об ошибке о кешировании и рендеринге двоичных файлов.

1 голос
/ 21 декабря 2011

2 варианта, которые я могу придумать:

  1. Создайте уникальный номер и добавьте его к URL-адресу изображения в качестве бесполезного параметра. Например, "http://url/application/image?personId=1&ts=12314125123". Так как это меняет URL-адрес каждый раз, когда генерируется страница, браузер не будет обращаться к кешу и будет каждый раз запрашивать изображение. Обычно метка времени работает лучше всего в качестве параметра.

  2. Найдите способ установить параметр заголовка ответа HTTP "Cache-Control" со значением "no-cache", когда изображение подается. Если вы используете пользовательский сервлет для потоковой передачи изображений, это должно быть довольно просто. Если нет, я не уверен, как вы можете сделать это, но, возможно, Play предоставляет способ.

В прошлом я обычно использовал вариант 1, потому что он почти всегда намного проще. Гетто, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...