Автор оригинала: Taimoor Choudhary.
Вступление
Amazon Web Services (AWS) предлагает широкий спектр надежных вычислительных услуг по запросу. Это достигается за счет управления инфраструктурой и ее сложностей, что упрощает процесс подготовки и запуска облачной инфраструктуры.
AWS позволяет ИТ-компаниям и разработчикам сосредоточиться на создании лучших решений для своих продуктов с масштабируемыми веб-сервисами по требованию, которые облегчают увеличение или уменьшение любого ресурса по мере развития приложения с течением времени.
Одним из таких продуктов является Простая служба хранения, или S3, которая позволяет дешево хранить файлы в масштабе.
Ведро S3
Сервис Amazon Simple Storage позволяет пользователям надежно и эффективно управлять своими статическими данными, храня их на серверах Amazon. К сохраненным данным можно получить доступ в любое время из любого места через Интернет.
Данные, хранящиеся в корзине S3, доступны через консоль управления Amazon, которая представляет собой интерфейс пользовательского интерфейса, а также интерфейс командной строки AWS и API REST S3 для разработчиков.
Весеннее облако AWS
Сервисы AWS могут быть интегрированы в Java-приложения с помощью Spring , которая является хорошо известной и наиболее часто используемой веб-платформой Java. Spring Cloud для веб-сервисов Amazon позволяет разработчикам получать доступ к сервисам AWS с меньшим объемом кода и простой интеграцией.
Весенний клиент Amazon S3
Корзина S3, в которой хранятся наши данные, доступна через клиент Amazon S3 Spring, предлагающий общие операции по управлению данными на сервере. В этом разделе мы покажем, как включить эту клиентскую библиотеку в ваш проект, а затем рассмотрим некоторые из распространенных операций S3, доступных через клиент.
Зависимости Maven
Первым шагом к интеграции AWS в проект Spring, конечно же, является импорт необходимых зависимостей. В этом случае мы будем использовать spring-cloud-starter-aws
, который содержит spring-cloud-aws-контекст
и |/spring-cloud-aws-автоконфигурация зависимости:
org.springframework.cloud spring-cloud-starter-aws
Конфигурация AWS Spring Cloud
Поскольку мы используем Spring Boot, естественно, большая часть конфигурации выполняется самой платформой. Однако конфигурации, связанные с AWS, должны быть указаны в приложении .yaml
файл:
cloud: aws: region.static: "[S3 Bucket region]" credentials: accessKey: "xxxxxxx" secretKey: "xxxxxxx"
Пожалуйста, имейте в виду, что имена и структуры свойств строго отформатированы и будут использоваться Spring Boot для настройки действительного подключения к сервисам AWS.
Объект “наблюдение” для управления запросами в корзину S3 с использованием клиента Amazon S3 является экземпляром класса AmazonS3
:
@Autowired private AmazonS3 amazonS3Client;
Мы подключим его автоматически как стандартный компонент Spring, и свойства из нашего файла .yaml
будут использованы для его подключения и подготовки к работе.
Загрузка файлов в S3
Файлы любого типа могут быть загружены в корзину S3, хотя один из наиболее распространенных вариантов использования-для хранения изображений. Хранение файлов/изображений, хранящихся в облаке, облегчает доступ к ним и обеспечивает их безопасность в стабильном и быстром сервисе, который способен масштабировать ресурсы, необходимые для обслуживания ваших файлов.
Прямая Загрузка Файлов/Составных Файлов
Как только клиент Amazon S3 заработает, вы сможете загрузить новый файл, просто вызвав метод putObject()
:
amazonS3Client.putObject(new PutObjectRequest("bucketName", "fileKey", file));
Где Имя корзины
– это имя корзины S3, в которую вы хотите загрузить файл. fileKey
– это строковое значение, которое однозначно идентифицирует загружаемый файл, и файл
является допустимым Файлом
объектом.
Если у вас есть файл из нескольких частей, поступающий в ваше приложение или микросервис через открытую конечную точку REST, его также можно загрузить. Для этого требуется немного дополнительного кода, и мы просто преобразуем Составной файл
в Файл
:
File file = new File("FileName"); try { FileOutputStream fileOutputStream = new FileOutputStream(file) fileOutputStream.write(multipartFile.getBytes()); } catch (IOException e) { /* Handle Exception */ }
То, что мы сделали, – это просто преобразовать составную часть в обычный объект Java File
с помощью FileOutputStream
. После преобразования его можно загрузить в корзину S3, используя тот же метод putObject ()
, что и раньше.
Загрузка файлов в виде метаданных
При обработке запросов и данных, полученных через конечные точки API, хранение копии данных на нашем собственном сервере перед их загрузкой в корзину S3 неэффективно с точки зрения затрат и просто излишне увеличивает размер нашего приложения, поскольку основным ресурсом для хранения файлов будет корзина S3.
Чтобы избежать необходимости сохранять копию, мы можем использовать PutObjectRequest
из API Amazon для загрузки файла в корзину, отправив его через Входной поток
и предоставив сведения о файле в виде метаданных:
ObjectMetadata objectMetaData = new ObjectMetadata(); objectMetaData.setContentType(multipartFile.getContentType()); objectMetaData.setContentLength(multipartFile.getSize()); try { PutObjectRequest putObjectRequest = new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData); amazonS3Client.putObject(putObjectRequest); } catch (IOException e) { /* Handle Exception */ }
Размер и тип содержимого файла определяются с помощью метаданных объекта
объекта. Входной поток файла добавляется в PutObjectRequest
вместе с именем корзины S3, в которую мы загружаем, а также именем файла для связи.
Как только объект PutObjectRequest
будет создан, его можно отправить в корзину S3 с помощью метода putObject ()
, как и раньше.
Загрузка файлов для общего просмотра
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Иногда мы можем пожелать, чтобы загруженные файлы были общедоступными. Например, читателю не должна требоваться авторизация для просмотра изображений в сообщении в блоге. До сих пор мы загружали файлы, для просмотра которых требуется наша авторизация.
AWS S3 предоставляет нам опции для установки уровня доступа к каждому загруженному файлу во время их загрузки.
Чтобы изменить уровень доступа и предоставить общедоступный доступ, давайте немного изменим запрос на загрузку данных:
new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData) .withCannedAcl(CannedAccessControlList.PublicRead)
Добавление свойства CannedAccessControlList.PublicRead
в PutObjectRequest
предоставляет общедоступный доступ только для чтения к загружаемому файлу, позволяя любому пользователю с правильным URL-адресом получить доступ/просмотреть файл.
Как только объект PutObjectRequest
будет создан, его можно будет загрузить в корзину S3, используя тот же метод putObject ()
, что и раньше.
Загрузка файлов с S3
После загрузки вы можете легко загружать файлы из своего хранилища с помощью метода GetObject()
через экземпляр класса Amazon S3
.
Возвращенный объект упаковывается в экземпляр объекта S3
, который затем может быть передан в обычный Объект
:
S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName"); S3ObjectInputStream inputStream = s3Object.getObjectContent(); byte[] bytes = StreamUtils.copyToByteArray(inputStream); File file = new File("File_Name"); try { FileOutputStream fileOutputStream = new FileOutputStream(file) fileOutputStream.write(bytes); } catch (IOException e) { /* Handle Exception */ }
Если запрос на загрузку файла сделан через конечную точку REST, мы можем вернуть данные файла вызывающему объекту без создания Файла
с помощью Spring ResponseEntity
:
S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName"); S3ObjectInputStream inputStream = s3Object.getObjectContent(); byte[] bytes = StreamUtils.copyToByteArray(inputStream); String contentType = s3Object.getObjectMetadata().getContentType(); return ResponseEntity.ok().contentType(contentType).body(bytes);
Таким образом, нам не нужно создавать файл на нашем сервере при загрузке из корзины S3, файл просто возвращается вызывающему абоненту в ответе API.
Удалить файл из корзины S3
Удаление файлов из корзины S3-самая простая задача, и все, что вам нужно знать, – это абсолютный путь к файлу.
Вызов метода DeleteObject()
с именем корзины и полным именем файла удаляет файл с сервера, если он существует:
amazonS3Client.deleteObject("bucketName", "fileName");
Вывод
Amazon S3 предоставляет удобный способ хранения файловых данных в облаке и обеспечивает надежную среду для доступа к данным в случае необходимости.
С помощью Spring Cloud AWS разработчики могут легко получить доступ к сервисам Amazon S3 из своего приложения для выполнения необходимых операций.
Для приложений Spring Boot все управление подключением к серверу Amazon выполняется самой Spring, что упрощает работу по сравнению с использованием обычного aws-java-sdk
с обычными приложениями Java.
Как видно из приведенных выше фрагментов кода, доступ к корзине S3 с помощью Spring Cloud AWS довольно прост, и объем кода также очень мал.
Исходный код проекта доступен на GitHub .