在AWS s3中,我可以使用我存储的最后一个标记来获取最新的文件吗?

时间:2018-01-31 09:11:09

标签: amazon-web-services amazon-s3 aws-sdk

ListObjectsRequest request = new ListObjectsRequest().withBucketName(bucketName);
ObjectListing listing = null;

while((listing == null) || (request.getMarker() != null)) {
listing = s3Client.listObjects(request);
// do stuff with listing
 request.setMarker(listing.getNextMarker()); //ALSO STORE MARKER FOR FUTURE USE
}

我这样做是为了使用文件夹中的所有文件。现在经过一段时间后,我想使用存储的标记只获取该文件夹中写入的新文件。那会有用吗?

2 个答案:

答案 0 :(得分:1)

由于以下几个原因,这对你没有帮助:

  • 标记只是一个词汇标记。对象键以词法(“按字母顺序”)顺序返回(通过对象键的utf-8编码表示进行二进制排序),而不是对象创建的顺序。
  • 在最后一个响应中,响应不会被截断,因此下一个标记应该为null或者不设置。

从SDK实际调用的服务的API参考:

  

NextMarker

     

当响应被截断时(即,响应中的IsTruncated元素值为true),您可以使用此字段中的键名作为后续请求中的标记来获取下一组对象。 Amazon S3按字典顺序列出UTF-8字符编码的对象。

     

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html

答案 1 :(得分:0)

我可以找到一种解决方法,该解决方法仅在我们可以控制存储在存储桶中的对象键的命名时适用。

  • 在对象键上添加一些加前缀的前缀(例如当前时间戳),以确保新对象按字典顺序排在旧对象之后。
  • 除了使用 nextMarker 之外,我们还可以在下一个请求中使用 最后一个对象的键 本身作为标记。
  

...您可以将响应中的最后一个Key的值用作后续请求中的标记,以获取下一组对象键。

     

https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html

尽管这是AWS cli的文档,但我已经通过Java SDK验证了相同的行为。