Открыть список
Как стать автором
Обновить

База изображений в любых форматах и разрешениях

PHP
заказчик: Пусть аватарки пользователей у нас будут в 50×50 и 100×100, в JPEG
разработчик: Готово

заказчик: Надо переделать, чтобы аватарки были в PNG
разработчик: Сделал

заказчик: Пусть аватарки будут в GIF, 25×25 и 40×40
разработчик: Ага, проверяй
заказчик: Уже? Как ты это так быстро делаешь???
разработчик: …

Как-то так

  1. Все загружаемые изображения хранятся в оригинальном формате, что позволяет трансформировать их с минимальной потерей качества.
  2. В DOCUMENT ROOT создаётся пустая папка, в которую помещается .htaccess, который в случае обращения к несуществующему файлу передаёт выполнение proxy.php.
  3. proxy.php в зависимости от соответствия URL запроса некому шаблону, к примеру /img/avatars/{id}_big.jpg берёт изображение с идентификатором {id}, выполняет над ним ряд трансформаций, сохраняет в файл по адресу соответствующему запросу и перенаправляет клиента на тот же URL.
  4. При повторном запросе с тем же URL proxy.php уже не вызывается т.к. необходимый файл с изображением уже существует.
Для осуществления подобной схемы есть библиотека Primage, реализующая всё вышесказанное в красивом и лаконичном виде.

А точнее

На базе этой самой Primage реализуем нашу версию proxy.php:

  1. // хранилище оригинальных изображений
  2. $avatarsStorage = new Primage_Proxy_Storage('data/avatars', 'jpg', 90);
  3. // хранилище трансформированных изображений
  4. $avatarsProxyStorage = new Primage_Proxy_Storage('public_html/img/avatars', 'jpg', 80);
  5. // роутер ассоциирующий шаблоны URL с контроллерами
  6. $router = new Primage_Proxy_Router(false);
  7. // контроллер для трансформации больших аватарок
  8. $avatarsBig = new Primage_Proxy_Controller_CopyById($avatarsStorage, $avatarsProxyStorage);
  9. $avatarsBig->addAction(new Primage_Proxy_Action_Resize(200, 300));
  10. $router->addController('avatars/{id}_big.jpg', $avatarsBig);
  11. // контроллер для трансформации маленьких аватарок
  12. $avatarsSmall = new Primage_Proxy_Controller_CopyById($avatarsStorage, $avatarsProxyStorage);
  13. $avatarsSmall->addAction(new Primage_Proxy_Action_Resize(50, 50));
  14. $router->addController('avatars/{id}_small.jpg', $avatarsSmall);
  15. // контроллер для трансформации аватарок с динамическим разрешением (будьте острожнее с контроллерами этого класса т.к. злоумышленник может запустить избыточную генерацию изображений)
  16. $step = 50;
  17. $maxWidth = 1000;
  18. $maxHeight = 1000;
  19. $avatarsDynamic = new Primage_Proxy_Controller_CopyWithResize($avatarsStorage, $avatarsProxyStorage, $maxWidth, $maxHeight, $step);
  20. $router->addController('avatars/{id}_{width}x{height}.jpg', $avatarsDynamic);
  21. // обработка запроса соответствующим контроллером
  22. $controller = $router->getController($_SERVER['REQUEST_URI'], &$params);
  23. if($controller) {
  24. try {
  25. $controller->dispatch($params);
  26. header('Location: ' . $_SERVER['REQUEST_URI']);
  27. exit;
  28. }
  29. catch(Primage_Proxy_Storage_SourceNotFound $e) {
  30. }
  31. catch(Primage_Proxy_Controller_RequestException $e) {
  32. }
  33. }
  34. header('HTTP/1.0 404 Not Found');

Это всё, что от нас потребовалось сделать, дальше дело за Primage, который кстати говоря включает в себя ещё несколько полезных функций в плане организации хранения и обработки изображений.

Скачать последнюю версию Primage, подписаться на обновления по RSS или поучаствовать в разработке можно на странице проекта.

Поздравляю всех с Праздником Дня Программиста!!!
Успехов нам всем! :)
Теги:phpвеб-разработкаизображениякартинкифотохостинг
Хабы: PHP
Всего голосов 157: ↑140 и ↓17 +123
Просмотры4K

Похожие публикации

Лучшие публикации за сутки