Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Примитивное создание миниатюр и хранение их на Amazon S3

Anna | 31.05.2014 | нет комментариев

Ни один сайт не может обойтись без генерации миниатюр изображений. В интернете дозволено обнаружить миллион статей на эту тему. Допустимо, кому-то сгодится и это решение.

Требования:

  • Изображения хранятся на удаленных серверах. У нас есть только ссылки на эти изображения
  • Миниатюра должна формироваться всякого заданного размера в момент непосредственного обращения к ней
  • Должна быть предусмотрена охрана от вредителей
  • Миниатюра должна храниться на Amazon S3 и быть доступна по поддомену основного сайта. число бакетов на S3 и соответственно поддоменов неограничено


Реализация:
Возможен, что имя нашего сайта domain.com

1) На Amazon S3 создаем 4 бакета с наименованиями ic1.domain.comic2.domain.comic3.domain.com,ic4.domain.com (наименования поддоменов могут быть различными, в нашем случае – это сокращение от image cache)

2) Заходим в настройки всякого бакета и ставим галочку наоборот Enable website hosting

3) В поле Edit Redirection Rules прописываем правила для редиректов с несуществующих страниц:

<RoutingRules>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <HostName>domain.com</HostName>
            <ReplaceKeyPrefixWith>s3/thumbs/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <HostName>domain.com</HostName>
            <ReplaceKeyPrefixWith>s3/thumbs/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

4) Заходим в панель управления доменным именем domain.com и создаем поддомены, схожие наименованиям бакетов. В IN A записи прописываем Endpoint из настроек бакета.

Что мы только что сделали:
Сотворили 4 поддомена, на которых будут храниться миниатюры. Всякая миниатюра будет иметь адрес типа:ic1.domain.com/miniatura.jpg

Как только к этому файлу будет первое обращение, Amazon увидит, что такого файла в бакетеic1.domain.com нет и перенаправит пользователя на указанный Вами путь, тот, что конкатенируется изHostName ReplaceKeyPrefixWithdomain.com/s3/thumb/miniatura.jpg

На сервере отлавливаем через роутер либо .htaccess файл запрос, создаем миниатюру переданного файла, отправляем ее на Amazon S3 в необходимый бакет и отображаем миниатюру первому пользователю.

Остальные пользователи – будут получать ее непринужденно с Amazon S3.

Поехали дальше.
До сих пор непостижимо как именно передавать параметры для минимизации и ссылку на саму картинку.
Что имеем:

Разумеется, что ссылка вида: ic1.domain.com/?Img_url=http://blablabla.com/photo15.jpg&Thumb_w=100&Thumb_h=100 нас безусловно не устраивает, т.к. во-первых Amazon нас не осознает, а во-вторых – нет никакой охраны от вредителей.

Вариантов, как создавать такие ссылки может быть миллион. Мы решили обойтись без промежуточных таблиц либо записей и посмотрели в сторону RC4 криптования. Звучит ужасно. Но давайте посмотрим, что получилось:
http://ic2.domain.com/e2/PUuxR1p~D~Jgl5PrnPMLh4OA0sO899rjZgzgWFU_.jpg
Достаточно таки милая ссылка. По крайней мере не гораздо ужасней чем md5 хеш. Но гораздо информативнее. Если расшифровать крипт, получим:
blablabla.com/photo15:100@100
То что нам нужно – все данные по фотографии, размеры и плюс ко каждому, не зная пароля от крипта – никто не сумеет нагенерить «лишних миниатюр»

Вопрос остался за малым – реализовать функцию, которая будет принимать ссылку на изображение, размеры и возвращать ссылку на миниатюру (ну и разумеется все остальные скрипты).

По ссылке на github некоторая реализация поставленной задачи: github.com/wolflingorg/s3thumb

Конструкция:
CS3Thumb.php – стержневой класс
S3.php – класс для работы с Amazon S3
CRC4Crypt.php – класс для криптования в RC4
CThumb.php – класс для создания миниатюр

Как применять:

$Thumb = new CS3Thumb($backets, $accessKey, $secretKey, $cryptpsw = 'password');

Где:
$backets — массив я названиями бакетов (они же поддомены)
$accessKey и $secretKey – доступы к амазону
$cryptpsw – пароль для криптования ссылок

Для того, Дабы получить ссылку на изображение, используем:

$Thumb -> url("http://blablabla.com/photo15.jpg", 100, 100);

Для того Дабы сделать миниатюру, переместить ее на S3 и отобразить первому пользователю:

$Thumb -> process("e2/PUuxR1p~D~Jgl5PrnPMLh4OA0sO899rjZgzgWFU_.jpg");

, где e2/PUuxR1p~D~Jgl5PrnPMLh4OA0sO899rjZgzgWFU_.jpg — то, что будет в ссылке позже domain.com/s3/thumbs/(*), позже редиректа с Amazon

Верю, статья будет пригодна. Спасибо.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB