通过AmazonS3Client获取对特定Bucket的引用

时间:2014-02-13 17:04:16

标签: java amazon-web-services amazon-s3

当我尝试通过Amazon Web Services API将对象上传到Amazon S3存储中的特定存储桶时,我显然需要对该现有存储桶的引用。我使用AmazonS3Client来执行此操作,但是我看不到任何方法,例如getBucket(String bucketID)

请点击此处:AmazonS3Client

我应用了强力搜索来获取对所需存储桶的引用:

AmazonS3Client connection = new AmazonS3Client(credentials);
Bucket targetBucket = null;

List<Bucket> buckets = connection.listBuckets();
for (Bucket bucket : buckets)
{
  if (bucket.getName().equals(bucketId))
  {
    targetBucket = bucket;
    break;
  }
}

显然,这很好用。但我想知道为什么API没有提供这么简单的方法,或者我可能会遗漏某些东西,或者您是否知道来自同一API的任何其他方法将用一行代码替换上面的行?

修改

对于像上传文件这样的简单任务,存储桶名称似乎就足够了:

if (connection.doesBucketExist(bucketId))
{
  connection.putObject(bucketId, ... );
}

但是,我的问题是标题所暗示的,为什么没有方法返回对特定Bucket实例的引用?

4 个答案:

答案 0 :(得分:1)

如果存在桶并且您拥有它,那么您的强制方法将获取Bucket对象,否则将导致null。要在不列出存储桶的情况下获得相同的结果:

  1. 调用AmazonS3Client.doesBucketExist(bucketId);如果为false,则结果为null。
  2. 调用AmazonS3Client.getBucketAcl(bucketId).getOwner()以获取存储桶的所有者。
  3. 如果存储桶的所有者不是您自己 - 可从AmazonS3Client.getS3AccountOwner()获得 - 您的结果为空。
  4. 如果存储桶的所有者是您自己,则结果为new Bucket(bucketId)
  5. 如果您已经知道拥有相关名称的存储桶,则可以跳过除最后一步之外的所有操作。

    不完全是单行结果,但它确实避免列出存储桶,如果你有大量的存储桶,这可能会很好,我认为这是API打算做你想做的事情。

答案 1 :(得分:0)

引用我的own article

  

createBucket调用是幂等的:如果存在,则不会抛出任何异常。

希望有所帮助

答案 2 :(得分:0)

我认为你没有遗漏任何东西。该列表中没有返回单个存储桶的API。 Ruby SDK似乎可以满足您的需求。 http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html

  

在将文件上传到S3之前,您需要创建一个存储桶。

     
    

s3 = AWS :: S3.new bucket = s3.buckets.create('my-bucket')

  
     

如果存储桶已存在,则可以获取存储桶的引用。

     
    

bucket = s3.buckets ['my-bucket']#没有请求

  

答案 3 :(得分:0)

我会给它一个刺。

根据Java DocREST API doc(v 1.7.1),没有什么可以传递给任何少于桶的完整列表。如果我不得不猜测,我会说这可能是因为亚马逊在他们的文档中谨慎地谨慎地创建/删除存储桶,从而将负担压缩到缓存响应或自己搜索它。还有每个帐户的桶数限制,因此响应中的桶数相当小。

该问题的其中一条评论提到,大多数调用都使用String而不是Bucket,这使我看了Bucket类。它包含的唯一字段不是其名称,而是所有者和创建日期。如果这是你想要的,那么它可能符合你的最佳利益,保持完整的响应。如果有的话,桶所有者和日期不会经常变化。

也许我在这里假设太多,但如果您只是在应用启动时或定期轮询服务以查看是否有任何更改,在需要时更新缓存并使用此缓存而不是点击它可能是最好的S3每当您需要此信息时。

还值得一提的是,如果您不需要所有者和创建日期,那么就没有什么能阻止您自己实例化Bucket并在其上设置名称。