7

如何使用 Java SDK 检查存储桶是否已存在于我的 Aws S3 账户中?

使用下面的代码

        AmazonS3ClientBuilder.defaultClient().doesBucketExistV2(bucketName);

检查存储桶的全局存在,如果具有此名称的存储桶全局存在,则返回 true,即使我不是该存储桶的所有者或者我无权访问该存储桶。

我理解以这种方式制作此方法的意图,以便它允许我们确定存储桶名称的可用性,但这不是我所需要的。当然,它会抛出我以后无法访问它的异常,但它会返回说明具有此名称的存储桶存在。

我想检查我的 S3 帐户中是否存在具有给定名称的存储桶,以便我可以对其执行操作。

一种可能的解决方案是list搜索所有存储桶并在返回的列表中搜索我的存储桶,我认为这在性能方面不是很好(如果我错了,请纠正我),因为可能有数十万个存储桶并在其中搜索他们效率不高。

如何确定我的 S3 帐户中是否存在未检查全局存在的存储桶

4

2 回答 2

8

一个HeadBucket请求就完成了这项工作。

HeadBucketRequest headBucketRequest = HeadBucketRequest.builder()
            .bucket(bucketName)
            .build();

    try {
        s3Client.headBucket(headBucketRequest);
        return true;
    } catch (NoSuchBucketException e) {
        return false;
    }
于 2020-10-18T16:34:26.013 回答
0

SDK 1.x 没有HeadBucketRequest构建器,也没有NoSuchBucketException.

如果有人正在使用AWS SDK for Java 1.x寻找答案,这可行:

private boolean checkAccessToBucket(final String bucketName) {
    try {
        final HeadBucketRequest request = new HeadBucketRequest(bucketName);
        s3Client.headBucket(request);
        return true;
    } catch (AmazonServiceException ex) {
        if (ex.getStatusCode() == 404 | ex.getStatusCode() == 403 || ex.getStatusCode() == 301) {
            return false;
        }
        throw ex;
    } catch (Exception ex) {
        LOGGER.error("Cannot check access", ex);
        throw ex;
    }
}
于 2022-01-28T21:56:29.697 回答