使用 Java 进行 AWS S3 文件搜索

2022-09-04 00:37:53

我们正在使用 Java 类通过以下代码从 AWS s3 存储桶中下载文件

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

AWSFileUtil 是一个类,它检查凭证并使用 getInputStream 方法从 S3bucket 获取输入流。文件路径是存储桶 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;
}

答案 1

Daan 使用 GET Bucket(列表对象)的答案(通过 AWS for 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响应代码中推断出存在(有关详细信息,请参阅错误响应),即NoSuchKey的响应为404 Not Found - 指定的键不存在。

同样,这可以通过Class 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

使用 GET 存储桶 S3 API:

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

,并将完整文件名指定为前缀。


推荐