#java #amazon-s3
#java #amazon-s3
Вопрос:
У меня возникли небольшие проблемы с этим кодом:
public boolean isExists(String key) {
try {
this.s3Client.getObjectMetadata(this.bucketName, key);
return true;
} catch (AmazonServiceException var3) {
return false;
}
}
Он всегда возвращает false, даже если «папка» в S3 существует (либо пустая, либо непустая), что может быть не так?
Приведенный s3Client
выше код — это всего лишь простой клиент AmazonS3:
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(objectStoreEndpoint, objectStoreRegion))
.build();
Как правильно проверить, существует ли папка в S3?
Ответ №1:
Решение этой проблемы заключается в том, чтобы сделать:
public boolean isExists(String key) {
ListObjectsV2Result result = this.s3Client.listObjectsV2(this.bucketName, key);
return result.getKeyCount() > 0;
}
Пустая «папка» (фактически говоря) вернет количество ключей, равное 1.
Комментарии:
1. Важное примечание, убедитесь, что
key
это закончится/
. Если этого не произойдет, то также будут учитываться файлы с одинаковым началом. Например. dirabc
, fileabcd
. После передачиabc
ключаabcd
файл будет принят во внимание.
Ответ №2:
Метод listObjectsV2(bucketName, key)
в примере, предоставленном quarks, устарел, так и должно быть сейчас:
public boolean doesKeyExist(String bucket, String key) {
ListObjectsV2Response listObjects =
s3Client.listObjectsV2(ListObjectsV2Request.builder().bucket(bucket).prefix(key).build());
return !listObjects.contents().isEmpty();
}
Ответ №3:
В S3 нет папок, в нем есть только сегменты и объекты. Большинство разработчиков используют /
символ для семантической организации имен объектов, но S3 не имеет структуры каталогов, как это делают файловые системы. В частности, на S3 никогда не может быть такого понятия, как «пустой каталог».
Самое близкое, что вы можете сделать, это перечислить на основе префикса.
Комментарии:
1. Как вы перечисляете с префиксом и проверяете, есть ли элементы?