Как заставить браузер принудительно перезагрузить картинки, которые не загрузились? В т. числе для распечатки

Приветствую всех.

Имеется страничка с которой мы распечатываем этикетки для собственных нужд, пользуемся ей только мы, скрипт самописный. На страничке этикетки и штрихкоды в виде картинок PNG, которые налету генерит PHP скрипт по параметру. Иногда, когда этикеток много (больше 50), сервер немного не справляется и некоторые картинки не грузятся. Причём, как выяснилось, при печати браузер страницу запрашивает заново с сервера и даже если вручную сделать «показать картинку» на пропущенных штрихкодах, при печати будут пропущены снова какие-то произвольные картинки.

Пока нашли выход: страницу сохраняем с картинками, а потом распечатываем из сохранённой копии. Можно как-то научить браузер картинки хотя бы кэшировать? Он ведь их отображает, но при печати забывает и загружает их заново!

Ещё я пока придумал поставить локально Apache и отдавать картинки по локалке, но это кривизна, т.к. вся система реализована, как сейчас модно говорить, «в облаке».

URL на картинку реализован через mod_rewrite и выглядит как обычная статичная картинка, например www.site.com/barcode/123456789.png

Картинка генерируется грубо говоря так:

header('Content-Type: image/png');
imagepng(........);

Т.е. выдаётся напрямую клиенту.

Используемый браузер IE8, перейти на другой нельзя, т.к. вся система оптимизирована под него.

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

Спасибо!
  • Вопрос задан
  • 6210 просмотров
Пригласить эксперта
Ответы на вопрос 4
Akuma
@Akuma
Веб-программист
Сделайте, чтобы картинки генерировались только один раз при запросе файла, если такового не существует.
Т.о. при повторном запросе картинок сервером, «старые» не будут генерироваться, а просто загрузятся
Ответ написан
@elgordo Автор вопроса
Кажется, проблему решило добавление строчки:

header('Cache-Control: max-age=37739520, public');

перед генерацией заголовка image/png

Javascript — это понятно, что можно всё это сделать, но это во-первых, сложное решение, во-вторых, от него всё будет тормозить ещё сильнее.
Ответ написан
Комментировать
@IDVsbruck
Контролировать загрузку javascript'ом: сначала скидывается статистика по странице — сколько, линки и т.д. Затем контролировать загрузку каждой картинки посредством события onload и изменять глобальный счетчик загрузки картинок. Возможно, прийдется поколдовать с таймером при незагрузке картинок и реактивировать повторную загрузку с случае неудачи получения картинки. Одним словом, создать алгоритм получения и контроля набора картинок.

Как вариант — если отдельно взятые картинки небольшие — получать их в base64 простым тектом и показывать на клиенте — получается как бы локальное хранилище. Причем, если картинки больше допустимой строки для base64, резать скриптом на сервере и отдавать клиенту. Пожалуй, в твоем случае наиболее удачный вариант — полный контроль над загрузкой графического контента.
Ответ написан
Комментировать
qxfusion
@qxfusion
1) рекомендую сделать отдачу картинок блоками (раз у Вас PNG) — на каждый блок ставить header: pragma-cache, Etag, Expire и т.д.
2) на стороне клиента создаете пустой блок далее присваиваете путь (имя файла должно быть рандомным) — далее смотрите через JS реальный размер блока — если картинка загружена — то размер блока будет равен размеру картинки, а иначе нет. Есть одно НО — ни в коем случае устанавливаете границы по ширине для этого блока + не помещайте в display:none — иначе трюк не сработает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы