【问题标题】:AWS SDK V2 S3 fetch object is not fetching objects more than 1000AWS SDK V2 S3 获取对象未获取超过 1000 个的对象
【发布时间】:2021-08-26 02:34:29
【问题描述】:

我正在使用 AWS 开发工具包版本:2.16.78。但是ListObjectsRequest 对象没有获取超过 1000 个的对象。

我确实浏览了文档,但找不到如何设置连续令牌。 我正在使用下面的代码 sn-p

 try {
        ListObjectsRequest listObjects = ListObjectsRequest
                .builder()
                .bucket(bucketName)
                .build();

        ListObjectsResponse res = s3.listObjects(listObjects);
        List<S3Object> objects = res.contents();

        for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) {
            S3Object myValue = (S3Object) iterVals.next();
            System.out.print("\n The name of the key is " + myValue.key());
         }

    } catch (S3Exception e) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }

以上代码仅获取 1000 个 s3 对象。

【问题讨论】:

    标签: java amazon-s3 aws-sdk


    【解决方案1】:

    正如你所说,AWS 只会return up to 1000 of the objects in a bucket:

    返回存储桶中的部分或全部(最多 1,000 个)对象。

    Amazon S3 按字母顺序列出对象。如果appropriate

    try {
    
      ListObjectsRequest listObjects = ListObjectsRequest
        .builder()
        .bucket(bucketName)
          .build()
      ;
    
      ListObjectsResponse listObjectsResponse = null;
      String lastKey = null;
    
      do {
        if ( listObjectsResponse != null ) {
          listObjectsRequest = listObjectsRequest.toBuilder()
             .marker(lastKey)
               .build()
          ; 
        }
    
        listObjectsResponse = s3.listObjects(listObjectsRequest); 
    
        List<S3Object> objects = listObjectsResponse.contents();
    
        // Iterate over results
        for (ListIterator iterVals = objects.listIterator();    iterVals.hasNext(); ) {
          S3Object myValue = (S3Object) iterVals.next();
          String key = myValue.key();
          System.out.print("\n The name of the key is " + key);
          // Update the value of the last key processed
          lastKey = object.key();
        }
      } while ( listObjectsResponse.isTruncated() );
    } catch (S3Exception e) {
      System.err.println(e.awsErrorDetails().errorMessage());
      System.exit(1);
    }
    

    使用列表对象 API ListObjectsV2Request startAfter 方法的 v2 可以实现非常相似的功能。

    在 v2 中,您也可以使用 ListObjectsV2Response 和延续令牌。类似于:

    try {
    
      ListObjectsV2Request listObjects = ListObjectsV2Request
        .builder()
        .bucket(bucketName)
          .build()
      ;
    
      ListObjectsV2Response listObjectsResponse = null;
      String nextContinuationToken = null;
    
      do {
        if ( listObjectsResponse != null ) {
          listObjectsRequest = listObjectsRequest.toBuilder()
             .continuationToken(nextContinuationToken)
               .build()
          ; 
        }
    
        listObjectsResponse = s3.listObjectsV2(listObjectsRequest); 
        nextContinuationToken = listObjectsResponse.nextContinuationToken();
    
        List<S3Object> objects = listObjectsResponse.contents();
    
        // Iterate over results
        for (ListIterator iterVals = objects.listIterator();    iterVals.hasNext(); ) {
          S3Object myValue = (S3Object) iterVals.next();
          String key = myValue.key();
          System.out.print("\n The name of the key is " + key);
        }
      } while ( listObjectsResponse.isTruncated() );
    } catch (S3Exception e) {
      System.err.println(e.awsErrorDetails().errorMessage());
      System.exit(1);
    }
    

    最后,您可以使用listObjectsV2Paginator 方法来迭代结果,就像在API 的v1 中使用listNextBatchOfObjects 一样。参见例如 this related v1 code 和这些 1 2 相关的 SO 问题。

    API v1 和 v2 版本的所有操作之间的映射都记录在 here

    【讨论】:

    • @Rushikesh Sabde 我编辑了答案,对代码进行了少量更改,对给您带来的不便深表歉意。
    猜你喜欢
    • 2019-06-16
    • 2020-01-18
    • 2018-09-24
    • 1970-01-01
    • 2017-10-24
    • 2022-11-26
    • 2017-06-27
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多