当我尝试通过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
实例的引用?
答案 0 :(得分:1)
如果存在桶并且您拥有它,那么您的强制方法将获取Bucket对象,否则将导致null。要在不列出存储桶的情况下获得相同的结果:
new Bucket(bucketId)
。如果您已经知道拥有相关名称的存储桶,则可以跳过除最后一步之外的所有操作。
不完全是单行结果,但它确实避免列出存储桶,如果你有大量的存储桶,这可能会很好,我认为这是API打算做你想做的事情。
答案 1 :(得分:0)
答案 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 Doc和REST API doc(v 1.7.1),没有什么可以传递给任何少于桶的完整列表。如果我不得不猜测,我会说这可能是因为亚马逊在他们的文档中谨慎地谨慎地创建/删除存储桶,从而将负担压缩到缓存响应或自己搜索它。还有每个帐户的桶数限制,因此响应中的桶数相当小。
该问题的其中一条评论提到,大多数调用都使用String
而不是Bucket
,这使我看了Bucket
类。它包含的唯一字段不是其名称,而是所有者和创建日期。如果这是你想要的,那么它可能符合你的最佳利益,保持完整的响应。如果有的话,桶所有者和日期不会经常变化。
也许我在这里假设太多,但如果您只是在应用启动时或定期轮询服务以查看是否有任何更改,在需要时更新缓存并使用此缓存而不是点击它可能是最好的S3每当您需要此信息时。
还值得一提的是,如果您不需要所有者和创建日期,那么就没有什么能阻止您自己实例化Bucket
并在其上设置名称。