Работа с S3 и облачными хранилищами в Java: библиотека AWS SDK

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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://                    

Рекомендаций