【问题标题】:deleteObjects using AWS SDK V2?使用 AWS 开发工具包 V2 删除对象?
【发布时间】:2018-12-27 19:54:13
【问题描述】:

我正在尝试从 AWS SDK V1.x 迁移到 V2.2。我无法弄清楚 deleteObjects 方法。我找到了一堆例子——都是一样的 :-( 似乎从来没有使用要删除的对象列表(即列表存在,但从未在 DeleteObjectsRequest 中设置对象 - 我认为应该设置它,但看不到在哪里)。我如何/在哪里提供对象列表?我找到的例子是:

    System.out.println("Deleting objects from S3 bucket: " + bucket_name);
    for (String k : object_keys) {
        System.out.println(" * " + k);
    }

    Region region = Region.US_WEST_2;
    S3Client s3 = S3Client.builder().region(region).build();
    try {
        DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
                .bucket(bucket_name)
                .build();
        s3.deleteObjects(dor);
    } catch (S3Exception e) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }

【问题讨论】:

    标签: amazon-s3 aws-sdk aws-java-sdk-2.x


    【解决方案1】:

    之前接受的答案非常有帮助,即使它不是 100% 完整。我用它写了下面的方法。虽然我还没有特别好地测试它的错误处理,但它基本上可以工作。

    • 传入String 键数组,将其转换为deleteObjects 所需的
      ObjectIdentifier 数组。
    • s3Clientlog 假定已在别处初始化。如果不需要,请随时删除日志记录。
    • 该方法当前返回成功删除的次数。

      public int deleteS3Objects(String bucketName, String[] keys) {
      
      List<ObjectIdentifier> objIds = Arrays.stream(keys)
              .map(key -> ObjectIdentifier.builder().key(key).build())
              .collect(Collectors.toList());
      try {
          DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
                  .bucket(bucketName)
                  .delete(Delete.builder().objects(objIds).build())
                  .build();
      
          DeleteObjectsResponse delResp = s3client.deleteObjects(dor);
      
          if (delResp.errors().size() > 0) {
              String err = String.format("%d errors returned while deleting %d objects",
                      delResp.errors().size(), objIds.size());
              log.warn(err);
          }
          if (delResp.deleted().size() < objIds.size()) {
              String err = String.format("%d of %d objects deleted",
                      delResp.deleted().size(), objIds.size());
              log.warn(err);
          }
          return delResp.deleted().size();
      }
      catch(AwsServiceException e) {
          // The call was transmitted successfully, but Amazon S3 couldn't process 
          // it, so it returned an error response.
          log.error("Error received from S3 while attempting to delete objects", e);
      }
      catch(SdkClientException e) {
          // Amazon S3 couldn't be contacted for a response, or the client
          // couldn't parse the response from Amazon S3.
          log.error("Exception occurred while attempting to delete objects from S3", e);
      }
      return 0;
      }
      

    (免费评论:我觉得奇怪的是,在 AWS SDK v2.3.9 中,deleteObjects 需要 Delete.BuilderObjectIdentifier 键,但 getObjectputObject 接受字符串键。为什么不 DeleteObjectsRequest.Builder只是有一个keys() 方法吗?他们还没有正式表示 SDK 是生产就绪的 AFAIK,所以其中一些可能会发生变化。)

    【讨论】:

    【解决方案2】:

    看起来需要更多的对象来分配 s3 中对象的键。这是未经测试的,我把方法的链接放在最后。

    System.out.println("Deleting objects from S3 bucket: " + bucket_name);
    
    for (String k : object_keys) {
        System.out.println(" * " + k);
    }
    
    Region region = Region.US_WEST_2;
    S3Client s3 = S3Client.builder().region(region).build();
    
    try {
    
       ObjectIdentifier objectToDelete = ObjectIdentifier.Builder()
                .key(KEY_OBJECT_TO_DELETE);
    
       Delete delete_me Delete.Builder.objects(objectToDelete) 
    
       DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
                .bucket(bucket_name)
                .delete(delete_me)
                .build();
    
        s3.deleteObjects(dor);
    
    } catch (S3Exception e) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }
    

    要删除的键 https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/ObjectIdentifier.html#key--

    删除对象 https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/ObjectIdentifier.Builder.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2023-01-18
      • 2021-09-04
      • 2017-03-08
      • 2015-04-15
      相关资源
      最近更新 更多