Проверьте, существует ли «папка» в S3

#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 это закончится / . Если этого не произойдет, то также будут учитываться файлы с одинаковым началом. Например. dir abc , file abcd . После передачи 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. Как вы перечисляете с префиксом и проверяете, есть ли элементы?