Как проверить, существует ли указанный ключ в данной корзине S3, используя Java - PullRequest
68 голосов
/ 29 ноября 2011

Я хотел бы проверить, существует ли ключ в данном сегменте с использованием Java.Я посмотрел на API, но нет никаких методов, которые были бы полезны.Я пытался использовать getObject, но это вызвало исключение.

Ответы [ 14 ]

230 голосов
/ 15 апреля 2016

В официальном Java API теперь есть метод didObjectExist .

Наслаждайтесь!

56 голосов
/ 04 апреля 2013

Обновление:

Кажется, есть новый API для проверки именно этого. Смотрите другой ответ на этой странице: https://stackoverflow.com/a/36653034/435605

Оригинальный пост:

Использование errorCode.equals("NoSuchKey")

try {
    AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
    String bucketName = getBucketName();
    s3.createBucket(bucketName);
    S3Object object = s3.getObject(bucketName, getKey());
} catch (AmazonServiceException e) {
    String errorCode = e.getErrorCode();
    if (!errorCode.equals("NoSuchKey")) {
        throw e;
    }
    Logger.getLogger(getClass()).debug("No such key!!!", e);
}

Примечание об исключении: я знаю, что исключения не должны использоваться для управления потоком. Проблема в том, что Amazon не предоставил API для проверки этого потока - просто документация об исключении.

21 голосов
/ 29 января 2013

Используя AWS SDK, используйте метод getObjectMetadata. Метод генерирует исключение AmazonServiceException, если ключ не существует.

private AmazonS3 s3;
...
public boolean exists(String path, String name) {
    try {
        s3.getObjectMetadata(bucket, getS3Path(path) + name); 
    } catch(AmazonServiceException e) {
        return false;
    }
    return true;
}
11 голосов
/ 04 августа 2015

В Amazon Java SDK 1.10+ вы можете использовать getStatusCode(), чтобы получить код состояния ответа HTTP, который будет 404, если объект не существует.

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import org.apache.http.HttpStatus;

try {
    AmazonS3 s3 = new AmazonS3Client();
    S3Object object = s3.getObjectMetadata("my-bucket", "my-client");
} catch (AmazonS3Exception e) {
    if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
        // bucket/key does not exist 
    } else {
        throw e;
    }
}

getObjectMetadata() потребляет меньше ресурсов, и ответ не нужно закрывать, как getObject().


В предыдущих версиях вы можете использовать getErrorCode() и проверить соответствующую строку (зависит от версии).

6 голосов
/ 29 ноября 2011

Используйте библиотеку jets3t.Это намного проще и надежнее, чем AWS SDK.Используя эту библиотеку, вы можете вызвать s3service.getObjectDetails ().Это будет проверять и извлекать только детали объекта (не содержимое) объекта.Он бросит 404, если объект отсутствует.Таким образом, вы можете перехватить это исключение и обработать его в своем приложении.

Но для того, чтобы это работало, вам необходимо иметь доступ к ListBucket для пользователя из этого сегмента.Просто доступ к GetObject не будет работать.Причина в том, что Amazon не позволит вам проверить наличие ключа, если у вас нет доступа к ListBucket.В некоторых случаях злоумышленникам будет достаточно просто знать, присутствует ключ или нет.Следовательно, если у них нет доступа к ListBucket, они не смогут этого сделать.

5 голосов
/ 17 июля 2014

Для PHP (я знаю, вопрос в Java, но Google привел меня сюда), вы можете использовать потоковые оболочки и file_exists

$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");
5 голосов
/ 16 мая 2013

Используйте в качестве ключа префикс установки ListObjectsRequest.

.NET код:

 public bool Exists(string key)
    {

        using (Amazon.S3.AmazonS3Client client = (Amazon.S3.AmazonS3Client)Amazon.AWSClientFactory.CreateAmazonS3Client(m_accessKey, m_accessSecret))
        {
            ListObjectsRequest request = new ListObjectsRequest();
            request.BucketName = m_bucketName;
            request.Prefix = key;
            using (ListObjectsResponse response = client.ListObjects(request))
            {

                foreach (S3Object o in response.S3Objects)
                {
                    if( o.Key == key )
                        return true;
                }
                return false;
            }
        }
    }.
4 голосов
/ 23 мая 2013

Этот код Java проверяет, существует ли ключ (файл) в корзине s3.

public static boolean isExistS3(String accessKey, String secretKey, String bucketName, String file) {

    // Amazon-s3 credentials
    AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey); 
    AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

    ObjectListing objects = s3Client.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(file));

    for (S3ObjectSummary objectSummary: objects.getObjectSummaries()) {
        if (objectSummary.getKey().equals(file)) {
            return true;
        }
    }
    return false;
}
3 голосов
/ 24 декабря 2015

Использование объекта isting. Java-функция для проверки наличия указанного ключа в AWS S3.

boolean isExist(String key)
    {
        ObjectListing objects = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(key));

        for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
        {
            if (objectSummary.getKey().equals(key))
            {
                return true;
            }

        }
        return false;
    }
3 голосов
/ 17 декабря 2015

Разбейте свой путь на ведро и объект.Тестирование сегмента с использованием метода doesBucketExist. Тестирование объекта с использованием размера списка (0 в случае отсутствия).Так что этот код будет делать:

String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket) 
       && !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...