使用Java进行AWS S3文件搜索

时间:2012-02-24 10:26:24

标签: java amazon-s3

我们正在使用java类从AWS s3存储桶下载文件,其中包含以下代码

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

AWSFileUtil是一个检查凭据并使用getInputStream方法从S3bucket获取输入流的类.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 个答案:

答案 0 :(得分:22)

Daan's answer使用GET Bucket (List Objects)(通过AWS for Java中的相应包装器,见下文)是一次获取多个对象所需信息的最有效方法(+1),当然,你需要相应地发布回复。

这最容易通过Class 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响应代码中推断存在(请参阅Error Responses for details ),即404 Not Found表示 NoSuchKey的响应 - 指定的键不存在

同样,这最容易通过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;
}

答案 1 :(得分:2)

使用GET Bucket S3 API:

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

并指定完整的文件名作为前缀。

答案 2 :(得分:0)

      这是在存储桶中查找现有文件夹的简单方法。以上答案也是如此。        文件夹名称最后包含'/',             它返回true。

注意:mybucket / userProfileModule / abc.pdf,它是我的文件夹structrue

foreach (MembershipUser user in Model)
{
    ProfileBase pb = ProfileBase.Create(user.UserName, true);
    //display fields
}