AWS SDK V2使用ListObjectsRequest查询S3仅返回1000条如何配置续传令牌
问题根因
S3原生ListObjects接口单次请求最多返回1000个对象,这是API的固定限制,和你使用的SDK版本无关。要拉取全量对象,需要通过续传令牌(Continuation Token) 分页拉取所有结果。
实现方案
方案1:使用SDK内置分页器(推荐)
AWS SDK for Java 2.x已经封装了全量分页逻辑,直接调用listObjectsPaginator方法即可自动处理续传令牌,无需手动维护分页状态,代码更简洁不易出错:
try { ListObjectsRequest listObjects = ListObjectsRequest .builder() .bucket(bucketName) .build(); // 分页器自动遍历所有页的对象 s3.listObjectsPaginator(listObjects).stream() .map(ListObjectsResponse::contents) .flatMap(List::stream) .forEach(myValue -> System.out.print("\n The name of the key is " + myValue.key())); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
方案2:手动维护续传令牌
如果需要自定义分页逻辑,可以手动判断是否存在后续页,每次请求携带上一次返回的nextContinuationToken即可:
try { String continuationToken = null; // 循环拉取直到没有后续页 do { ListObjectsRequest.Builder requestBuilder = ListObjectsRequest .builder() .bucket(bucketName); // 存在续传令牌时带入请求参数 if (continuationToken != null) { requestBuilder.continuationToken(continuationToken); } ListObjectsResponse res = s3.listObjects(requestBuilder.build()); // 处理当前页的对象 for (S3Object myValue : res.contents()) { System.out.print("\n The name of the key is " + myValue.key()); } // 获取下一页的续传令牌,无后续页时返回null continuationToken = res.nextContinuationToken(); } while (continuationToken != null); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); }
补充说明
如果需要调整单次请求返回的对象数量,可以在构造ListObjectsRequest时添加maxKeys参数,参数最大值为1000。
内容的提问来源于stack exchange,提问作者Rushikesh Sabde
相关产品推荐
相关产品推荐

