Поиск файлов AWS S3 с использованием Java - PullRequest
12 голосов
/ 24 февраля 2012

Мы используем класс Java для загрузки файла из корзины AWS s3 со следующим кодом

inputStream = AWSFileUtil.getInputStream(
            AWSConnectionUtil.getS3Object(null),
            "cdn.generalsentiment.com", filePath);

AWSFileUtil - это класс, который проверяет учетные данные и получает входной поток из S3bucket с помощью метода getInputStream.filePath - это файл внутри корзины cdn.generalsentiment.com.

Мы хотим написать метод, который может просто проверить, существует ли конкретный файл в корзине AWS S3 и возвращает логическое или другое значение.

Пожалуйста, предложите мне решение для этого.

public static boolean isValidFile(AmazonS3 s3,
        String bucketName,
        String path) throws AmazonClientException {
    try {
        ObjectMetadata objectMetadata =  
s3.getObjectMetadata("cdn.generalsentiment.com", path);
    } catch (NotFoundException nfe) {
        nfe.printStackTrace();
    }

    return true;
}

Если файл существует, он возвращает true, иначе он генерирует исключение NotFoundException, которое я хочу перехватить и вернуть результат метода isValidFile как false.Ребята, любая другая альтернатива для тела метода или типа возврата была бы отличной.

Обновленная

public static boolean doesFileExist(AmazonS3 s3,
        String bucketName,
        String path) throws AmazonClientException,
        AmazonServiceException {
    boolean isValidFile = true;
    try {
        ObjectMetadata objectMetadata = 
s3.getObjectMetadata("cdn.generalsentiment.com", path);

    } catch (NotFoundException nfe) {
        isValidFile = false;
    }
   catch (Exception exception) {
        exception.printStackTrace();
        isValidFile = false;
    }
    return isValidFile;
}

Ответы [ 3 ]

22 голосов
/ 24 февраля 2012

ответ Даана с использованием GET Bucket (список объектов) (через соответствующую оболочку из AWS для Java , см. Ниже) - наиболее эффективный подход к получить нужную информацию для многих объектов одновременно (+1), вам, конечно, нужно будет соответственно обработать ответ.

Это проще всего сделать одним из соответствующих методов класса AmazonS3Client , например, listObjects (String bucketName) :

AmazonS3 s3 = new AmazonS3Client(); // provide credentials, if need be
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
        .withBucketName("cdn.generalsentiment.com");
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    System.out.println(objectSummary.getKey());
}

Альтернативный

Если вас интересует только один объект (файл) за раз, использование HEAD Object будет гораздо более эффективным, поскольку вы можете определить существование прямо из соответствующего HTTP-кода ответа (см. * 1020). * Ответы об ошибках для подробностей ), т.е. 404 Не найдено для ответа NoSuchKey - указанный ключ не существует .

Опять же, это проще всего сделать с помощью класса AmazonS3Client , а именно getObjectMetadata (String bucketName, String key) , например ::

public static boolean isValidFile(AmazonS3 s3,
        String bucketName,
        String path) throws AmazonClientException, AmazonServiceException {
    boolean isValidFile = true;
    try {
        ObjectMetadata objectMetadata = s3.getObjectMetadata(bucketName, path);
    } catch (AmazonS3Exception s3e) {
        if (s3e.getStatusCode() == 404) {
        // i.e. 404: NoSuchKey - The specified key does not exist
            isValidFile = false;
        }
        else {
            throw s3e;    // rethrow all S3 exceptions other than 404   
        }
    }

    return isValidFile;
}
2 голосов
/ 24 февраля 2012

Используйте GET Bucket S3 API:

http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html

и укажите полное имя файла в качестве префикса.

0 голосов
/ 17 декабря 2018

это простой способ найти существующую папку в корзине.выше ответ также верно.имя папки, наконец, содержит «/», оно возвращает true.

Примечание: mybucket / userProfileModule / abc.pdf, это моя папка structrue

    boolean result1 = s3client.doesObjectExist("mybucket", "userProfileModule/");
    System.out.println(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...