Решение - resize на лету.
Проблемы - нагрузка на железо.
Как выкручивался:
В качестве точки старта выбрал готовую функцию CIBlock::ResizePicture(). Создал скрипт resize.php который будет возвращать браузеру уменьшенную картинку:
i - id картинки в b_file
h - высота
w - ширина
В этот скрипт помещаем нашу функцию, вокруг которой и будут происходить танцы с бубном. Перво-наперво, на всякий случай выключим всё не нужное - define("SM_SAFE_MODE", true) и очистим вывод $APPLICATION->RestartBuffer(). Для каждого типа изображения добавляем хедер - header("Content-type: image/jpeg") - для каждого свой! Теперь уменьшим нагрузку (только если есть frontend) -
header("Pragma: public");//может кэшироваться всеми (прокси-серверами тоже)
header("Cache-Control: max-age=100000000");//закэшируем на сто тысяч мильонов лет
Нюансы: злоумышленники перебирая параметры i и h и w могут заполнить кэш проксирующего сервера, да и вообще сделать не нужную нагрузку на сервер. Решение проблемы - кодировать передаваемые параметры (двустороннее кодирование!):
- ещё хорошо бы ограничить максимальные значения h и w.
пример можно взять , а красиво посмотреть










Чему детей учите?
p.s. извините конечно за пошлость, но это как раз тот случай, когда сначало больно, а потом нормально (когда кэш наполнится)
/pic/80/366346.jpg
80 - это ширина картинки
можно сделать еще и так /pic/80/60/366346.jpg
где 80х60 - то, что должно получиться
при первом обращении создается превью, которое потом сохраняется на диске и счастливо работает уже как статика с диска.
P.S. В скрипте нет проверки на максимум, т.е. если я укажу resize.php?i=7840&h=12000000000000000000&w=400 серверу может поплохеть.