Загрузите файл в папку AS S3 с помощью Java

Пытаюсь загрузить файлы в папку под ведерком в s3, но у меня проблема с путем. Вот пример кода:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.core.sync.ResponseTransformer;

public class S3Uploader {

    public static void main(String[] args) {
        String bucketName = "user-bucket";
        String folderName = "user-data";
        String fileName = "user.txt";
        String fileContent = "test data";

        Region region = Region.US_EAST_1;

        S3Client s3 = S3Client.builder().region(region).build();

        try {
            PutObjectRequest request = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(folderName + "/" + fileName)
                    .build();

            s3.putObject(request, RequestBody.fromString(fileContent));
            System.out.println("File uploaded successfully to S3!");
        } catch (S3Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}

Код показывает ошибку и преобразует или кодирует «/» в «%2f», как устранить эту ошибку?

Ошибка загрузки объекта: исключение при вызове s3.PutObject: [Errno 2] Нет такого файла или каталога: '/persisted-data/s3/assets/user-bucket/user-data%2fuser.txt@null'

Почему он показывает @null?

Я использую localstack с командой dokcer-compose!

Возможно, из-за RequestBody.fromString(fileContent)?

jarmod 07.03.2024 18:38

Я не могу это воспроизвести. Используя ваш точный код (за исключением имени корзины и добавленного поставщика учетных данных), я могу выполнить это нормально. Моя среда — Ubuntu 22.04, Java 21.02 и v2.25.3 из AWS Java SDK. Можете ли вы изменить код, чтобы обработчик исключений выполнял e.printStackTrace() и обновлял вопрос?

stdunbar 07.03.2024 19:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код AWS SDK для Java V2 работает. Единственное отличие, которое я вижу, это RequestBody.fromFile(new File(objectPath).

public class S3Uploader {

    public static void main(String[] args) {
        String bucketName = "myjunebucketxxx";
        String objectPath = "C:\\AWS\\AdobePDF.pdf";
        String objectKey = "books/Adobe.pdf";
        Region region = Region.US_EAST_1;
        S3Client s3 = S3Client.builder().region(region).build();
        putS3Object(s3, bucketName, objectKey, objectPath);

    }

    public static void putS3Object(S3Client s3, String bucketName, String objectKey, String objectPath) {
        try {
            PutObjectRequest putOb = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(objectKey)
                .build();

            s3.putObject(putOb, RequestBody.fromFile(new File(objectPath)));
            System.out.println("Successfully placed " + objectKey + " into bucket " + bucketName);

        } catch (S3Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}

Обратите внимание, что мой PDF-документ находится в правильном месте:

Другие вопросы по теме