Pull to refresh

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

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

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

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

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

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

<img src=”/image/resize/200x200/path_to_file” >

Как видно из роута, контроллер у нас будет называться 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 содержит достаточно много интересных настроек, одна из которых это кэширование, чего не было в нашей реализации.

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

А какие вы используете методики для генерации превьюшек?

P.S. Планируется небольшая серия статей по Kohana: организация структуры контроллеров, «автогенерация» админ панели для работы с типовыми объектами данных, использование smarty и т. д.
Tags:
Hubs:
+11
Comments 30
Comments Comments 30

Articles