我能够使用Java轻松地从我的S3 Bucket中获取单个项目,并获取对象元数据,但似乎没有简单的方法来获取桶中对象的位置。以下是我所知道的事情:
* There is a workaround in place to list all the objects
* There is some sort of marker system in place for continuing ListObjectRequests
但是,从列表末尾按字母顺序找出我的位置是最简单/最优的方法是什么?
此时,解决方案似乎相当复杂
public JSONObject objectPosition(String key) {
ObjectListing listing = CLIENT.listObjects( bucketName, prefix );
List<String> keys = new ArrayList<String>();
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated()) {
for(S3ObjectSummary s3o : summaries) {
keys.add(s3o.getKey());
}
listing = CLIENT.listNextBatchOfObjects (listing);
summaries = listing.getObjectSummaries();
}
JSONObject jo = new JSONObject();
jo.put("totalSize", Integer.toString(keys.size()));
jo.put("position", Integer.toString(key.indexOf(key)));
return jo;
}
但是这意味着每次触摸我的端点时,我不仅要查询s3以获取所有对象及其键,而且我必须找到我需要检查大型列表中位置的键。不幸的是,调用之间的本地持久性不是一个选项 - 所以可能在s3存储桶中放置某种大小的文件是解决方案吗?
答案 0 :(得分:1)
对象的位置是它的前缀和名称,相对于其他对象前缀和名称,如Michael-sqlbot所提到的那样。您需要列出所有对象以获取所有对象的位置。 相反,尝试跟踪存储桶内容的更改,而不是轮询/扫描端点更改。扫描您的存储桶将产生S3 List API通话费用。 您可以尝试启用S3 Events,然后文件创建/删除事件可以触发用Python或其他语言编写的AWS Lamba,以处理或保存存储桶中已更改的路径。每月首批100万次Lamba执行是免费的。