Kohana, Image Preview — это просто

С недавних пор, примерно год назад, перед нашей командой стояла задача выбора PHP фреймворка для реализации «серьезных» проектов. Почему в итоге выбрали Kohana, я уже и не помню, скорее всего интуитивно, подкупившись на его простоту, легкость и не высокий порог входа. На тот момент текущая версия была 3.0 и мы полные энтузиазма вгрызлись в документацию.

В любом «серьезном» проекте перед разработчиком встает задача генерации уменьшенных копий загружаемых пользователем картинок. Почитав различные HOW TO, мы решили использовать генерацию превью при запросе изображения через url.

Для начала необходимо создать route:

Route::set('image_resize', 'image/resize/x(/)', array('width' => '\d+', 'height' => '\d+', 'file' => '.+'))
        ->defaults(array(
            'controller' => 'media',
            'action' => 'resize',
        ));

Пример HTML кода для генерации preview:


Как видно из роута, контроллер у нас будет называться Controller_Media c методом по умолчанию action_resize(). В экшене мы принимаем параметры запроса и генерируем превью используя модуль Image, который надо подключить в bootstrap.php:

// Загружаем изображение
$image = Image::factory($file)
// Меняем размеры
$image->resize($width, $height);
// Сохраняем превью
$image->save($file_preview);

В самом конце экшена нам надо сформировать заголовки и вернуть саму превьюшку:

$this->response->body(file_get_contents($file_preview));
$this->response->headers('Content-Type', File::mime_by_ext($pathinfo['extension']));
$this->response->headers('Content-Length', filesize($file_preview));
$this->response->headers('Last-Modified', date('r', filemtime($file_preview)));

Естественно, спустя некоторое время, захотелось поискать уже готовые решения (на тот момент мы уже перешли на версию Kohana 3.2). В результате оказалось, что в документации есть примеры по работе с модулем Image (в 3.0 этот раздел был пустой) и нашелся замечательный модуль Imagefly.

Данный модуль использует тот же принцип генерации превью через url. Например, ссылка /imagefly/w100-h150-c/path/to/image.jpg, уменьшает изображение в ширину до 100px и в высоту до 150px, а затем делает crop полученного изображения, сохраняя его в папку для превьюшек, указанную при конфигурации модуля. Кстати, Imagefly содержит достаточно много интересных настроек, одна из которых это кэширование, чего не было в нашей реализации.

Таким образом, в очередной раз убеждаемся, что проще использовать уже готовые наработки, но, черт возьми, иногда так приятно изобретать свои корявенькие, страшненькие, но работающие велики.

Все записи