2017-02-12 10 views
0

Приложение, в котором я работаю (nodejs), имеет профили пользователей, и каждый профиль может иметь несколько изображений. Я использую S3 в качестве основного хранилища и CloudFront для их распространения.Лучший способ сохранить изображения на Amazon S3 и распространять их с помощью CloudFront

Дело в том, что иногда пользователи загружают большие изображения, а то, что я хочу сделать, - это масштабирование изображения при его загрузке (просмотр его в теге html img или мобильном телефоне) в основном из-за производительности.

Я не знаю, должен ли я масштабировать изображение ПЕРЕД отправкой его на S3 (возможно, используя lwip https://github.com/EyalAr/lwip), или есть способ масштабирования изображения или получения изображения низкого качества при загрузке через CloudFront ?. Я прочитал, что CloudFront может сжимать файлы с помощью Gzip, но также не рекомендуется для изображений.

Я также не хочу загружать масштабированное + исходное изображение на S3 из-за хранения.

Должно быть сделано на клиенте, сервере или S3? Каков наилучший способ сделать это?

ответ

2

Есть ли способ масштабирования изображения или получения изображения низкого качества при загрузке через CloudFront?

Нет такой функции. Если вы хотите, чтобы размер изображения был изменен, изменен, масштабирован, сжат и т. Д., Вам нужно сделать это, прежде чем он будет сохранен в его конечном месте на S3.

Отметьте, что я говорю его final место в S3.

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

Я прочитал, что CloudFront может сжимать файлы с помощью Gzip, но также не рекомендуется для изображений.

изображения пользу очень мало отличается от сжатия GZIP, но документация CloudFront также указывает на то, что CloudFront doesn't compress anything that isn't in some way formatted as text, которая стремится извлечь выгоду гораздо больше от сжатия GZIP.

Я также не хочу загружать масштабированное + исходное изображение на S3 из-за хранения.

Я считаю, что это ошибка с вашей стороны.

«Сжатие» изображений не похоже на сжатие zip-файла. Сжатие изображений lossy. Вы не можете восстановить исходное изображение из сжатой версии, потому что сжатие изображения, как описано здесь, по определению, - это преднамеренная отбрасывание информации от изображения до такой степени, что размер находится в пределах требуемого диапазона, и пока качество находится в приемлемом диапазоне , Сжатие изображения - это и наука, и искусство. Если вы не сохранили исходное изображение, и позже вы решите, что хотите изменить алгоритм сжатия изображения (либо потому, что позже вы решите, что размеры все еще слишком велики, либо потому, что вы решили, что исходный алгоритм был слишком агрессивным и приводил к неприемлемо низкой качество), вы не сможете запускать уже сжатые изображения с помощью алгоритма сжатия во второй раз без дальнейшей потери качества.

Используйте класс хранения S3 STANDARD_IA («редкий доступ»), чтобы сократить стоимость хранения исходных изображений пополам, в обмен на более дорогие загрузки - поскольку эти изображения редко будут загружаться снова, поскольку только вы будете знать их URL-адреса в ведре, где они хранятся.

Должно быть сделано на клиенте, сервере или S3?

Это не может быть сделано «в» S3, потому что S3 хранит объекты только. Он не манипулирует ими.

Это оставляет два варианта, но выполнение этого на сервере имеет несколько вариантов.

Когда вы говорите «сервер», вы, вероятно, думаете о своем веб-сервере. Это один из вариантов, но этот процесс может быть потенциально ресурсоемким, поэтому вам нужно учитывать его в своих планах по масштабируемости.

Есть проекты на GitHub, такие как this one, предназначенные для этого, используя AWS Lambda, который обеспечивает выполнение «безсерверного» кода по требованию. Код работает на сервере, но он не является сервером, который вы должны настроить или поддерживать или оплачивать, когда он неактивен - Lambda выставлен счет за 100 миллисекунд. Это второй вариант.

Выполнение этого на клиенте, конечно, является опцией, но представляется потенциально более проблематичным и подверженным ошибкам, не говоря уже о том, что некоторые решения будут специфичными для платформы.

Существует не лучший способ выполнить эту задачу.

Если вы не знакомы с метаданными EXIF, вам также необходимо ознакомиться с этим. В дополнение к повторной выборке/изменению размеров вам, вероятно, также необходимо снять некоторые метаданные с изображений, созданных пользователями, чтобы избежать выявления конфиденциальных данных, которые ваши пользователи не могут реализовать, прикрепляется к их изображениям, таким как координаты GPS, где фотография была приняты. Некоторые сайты также водяного знака их пользовательских изображений это тоже будет то, что вы, вероятно, будет делать в то же время.

+1

Очень информативный и подробный! Отличный ответ. –

+0

Я отредактировал мой вопрос, я хотел спросить, есть ли способ, но я написал, что есть способ, мой плохой. Большое спасибо за ответ, отличная отличная информация. –

+0

@ IbraheemAl-Saady спасибо, я обновил свою цитату из вопроса в соответствии с вашими изменениями. –

 Смежные вопросы

  • Нет связанных вопросов^_^