Работа с S3 и облачными хранилищами в Java с помощью AWS SDK
Облачные объектные хранилища по протоколу S3 (Amazon Simple Storage Service) стали стандартом де-факто для хранения неструктурированных данных. В Java для работы с S3-совместимыми хранилищами (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces и др.) используется официальная библиотека AWS SDK for Java. В этой статье мы разберём подключение, инициализацию клиента и основные операции с файлами.
Подключение AWS SDK
Для работы с S3 добавьте зависимость в pom.xml (Maven):
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.27.0</version>
</dependency>
Для Gradle:
implementation 'software.amazon.awssdk:s3:2.27.0'
Создание S3-клиента
Клиент настраивается через билдер. Для Amazon S3 достаточно указать регион:
S3Client s3 = S3Client.builder()
.region(Region.EU_CENTRAL_1)
.build();
Для совместимых хранилищ (MinIO, Yandex Object Storage) нужно указать endpoint и credentials:
String endpoint = "https://storage.yandexcloud.net";
String accessKey = "YOUR_ACCESS_KEY";
String secretKey = "YOUR_SECRET_KEY";
S3Client s3 = S3Client.builder()
.endpointOverride(URI.create(endpoint))
.region(Region.US_EAST_1) // регион может быть любым
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)))
.build();
Основные операции с бакетами
- Создание бакета
- Проверка существования
- Удаление бакета
Пример создания бакета:
String bucketName = "my-java-bucket";
try {
s3.createBucket(CreateBucketRequest.builder()
.bucket(bucketName)
.build());
System.out.println("Бакет создан: " + bucketName);
} catch (S3Exception e) {
System.err.println("Ошибка: " + e.awsErrorDetails().errorMessage());
}
Загрузка файлов (Upload)
Загрузить файл можно из потока, строки или локального файла:
// Загрузка из локального файла
s3.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key("docs/report.pdf")
.build(),
RequestBody.fromFile(Paths.get("/home/user/report.pdf")));
// Загрузка строки как текстового файла
s3.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key("hello.txt")
.contentType("text/plain")
.build(),
RequestBody.fromString("Hello, S3!"));
Скачивание файлов (Download)
Для получения объекта используйте getObject:
// Скачивание в файл
s3.getObject(GetObjectRequest.builder()
.bucket(bucketName)
.key("docs/report.pdf")
.build(),
ResponseTransformer.toFile(Paths.get("downloaded_report.pdf")));
// Скачивание в строку
String content = s3.getObjectAsBytes(GetObjectRequest.builder()
.bucket(bucketName)
.key("hello.txt")
.build())
.asUtf8String();
System.out.println(content);
Удаление объектов
s3.deleteObject(DeleteObjectRequest.builder()
.bucket(bucketName)
.key("hello.txt")
.build());
System.out.println("Файл удалён");
Список объектов в бакете
Чтобы получить список всех файлов (с постраничной выдачей):
ListObjectsV2Request listReq = ListObjectsV2Request.builder()
.bucket(bucketName)
.maxKeys(100)
.build();
ListObjectsV2Response listRes = s3.listObjectsV2(listReq);
for (S3Object obj : listRes.contents()) {
System.out.println(" - " + obj.key() + " (" + obj.size() + " байт)");
}
Работа с MinIO (локальное S3-хранилище)
MinIO — популярное решение для локального тестирования. Запустите его через Docker:
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio server /data --console-address ":9001"
Подключение из Java:
S3Client minioClient = S3Client.builder()
.endpointOverride(URI.create("http:// Также в библиотеке
Конфигурация приложений Rust: библиотеки config, envy и dotenvy
Elasticsearch клиент для C# (.NET): NEST и Elastic.Clients.Elasticsearch
Swagger/OpenAPI генерация для JavaScript (Node.js) — инструменты и библиотеки