Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在AWS s3中,我是否可以使用最后一个标记I';你储存了什么?_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Amazon web services 在AWS s3中,我是否可以使用最后一个标记I';你储存了什么?

Amazon web services 在AWS s3中,我是否可以使用最后一个标记I';你储存了什么?,amazon-web-services,amazon-s3,aws-sdk,Amazon Web Services,Amazon S3,Aws Sdk,我这样做是为了使用文件夹中的所有文件。现在,经过一段时间后,我想使用存储标记只获取写入该文件夹的新文件。这样行吗?这对你没有帮助,原因有两个: 标记只是一个词汇标记。对象键按词法(“字母顺序”)顺序返回(按对象键的utf-8编码表示进行二进制排序),而不是对象创建的顺序 在最后一个响应上,响应未被截断,因此下一个标记应为null或未设置 根据SDK实际调用的服务的API引用: NextMarker 当响应被截断时(即响应中的IsTruncated元素值为true),您可以在后续请求中使用此字

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

这对你没有帮助,原因有两个:

  • 标记只是一个词汇标记。对象键按词法(“字母顺序”)顺序返回(按对象键的utf-8编码表示进行二进制排序),而不是对象创建的顺序
  • 在最后一个响应上,响应未被截断,因此下一个标记应为null或未设置
根据SDK实际调用的服务的API引用:

NextMarker

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


我可以找到一种解决方法,并且只有在我们能够控制存储在存储桶中的对象密钥的命名时才适用

  • 在对象键上附加一些accending前缀(如当前时间戳),以确保新对象按字典顺序排在旧对象之后
  • 除了使用nextMarker,我们还可以在下一个请求中使用最后一个对象的键本身作为标记
…您可以使用响应中最后一个键的值作为后续请求中的标记,以获取下一组对象键


虽然这是AWS cli的文档,但我已经通过Java 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
}