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




Этот код 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-документ находится в правильном месте:
Возможно, из-за
RequestBody.fromString(fileContent)?