Pull to refresh

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

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

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

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

Поздравляю всех с Праздником Дня Программиста!!!
Успехов нам всем! :)
Tags:
Hubs:
+123
Comments153

Articles

Change theme settings