Ответы на этот вопрос могут быть очень самоуверенными, но вот мои два цента.
В общем, вы должны использовать отдельные эскизы, которые создаются во время загрузки изображений или, что намного лучше, в фоновом режиме после загрузки изображения. С системой очередей Laravels это довольно просто. Причины очень просты и уже упоминались в комментариях:
- Миниатюры должны быть сгенерированы только один раз (генерация миниатюр на основе запроса вызывает большую нагрузку и потенциальную проблему производительности)
- Хранение дешево и быстро
Идентификация thumnails может быть выполнена путем сохранения имени файла миниатюры или, как вы уже предложили, с помощью некоторой логики для разрешения миниатюр на основе исходного файла. Лично я хотел бы использовать структуру папок, которая позволяет создавать различные эскизы, например ::
.
images/
original/
123456789.jpg
thumbnail/
100x100/
123456789.jpg
200x200/
123456789.jpg
Имена каталогов 100x100
и 200x200
, конечно, могут быть изменены на то, что вам подходит. Использование предложенных вариантов означало бы для меня, что миниатюра не шире, чем 100 пикселей, и не выше, чем 100 пикселей. Это не означает, что каждая миниатюра имеет размер 100x100 пикселей, хотя вы также можете реализовать такой генератор миниатюр, если вам нужно.
Будьте осторожны, что вам может понадобиться некоторая резервная логика для отображения эскизов, пока они еще генерируются, если вы используете для этого фоновые рабочие. Резервным вариантом может быть изображение по умолчанию или оригинал, размер которого изменяется с помощью HTML.
Кстати, если вы внедрите генератор миниатюр, вы также можете рассмотреть возможность использования оптимизатора изображений. Большинство изображений можно минимизировать, чтобы пользователи не заметили (существенную) разницу. Стоит ли такая система или нет, зависит от количества отображаемых изображений и объема трафика на вашем сайте. Для интенсивно используемых сайтов это может быть хорошей идеей для экономии трафика. Существующее решение для этого - spatie / image-optimizer (я никак не связан с spatie).