【问题标题】:How to delete multiple objects in an Amazon S3 bucket using Java V2如何使用 Java V2 删除 Amazon S3 存储桶中的多个对象
【发布时间】:2022-10-15 17:54:22
【问题描述】:

所以我想删除所有可能在 s3 文件夹中的对象(基本上带有特定前缀)。
我怎么做? 我目前正在使用这个while (true) 循环,但有人告诉我这不是使用while (true) 的好方法。
这就是我现在正在使用的。

while (true) {
    for (S3ObjectSummary objectSummary: objectListing.getObjectSummaries()) {
        this.s3Client.deleteObject(bucketName, objectSummary.getKey());
    }

    if (objectListing.isTruncated()) {
        objectListing = s3Client.listNextBatchOfObjects(objectListing);
    } else {
        break;
    }
}

【问题讨论】:

  • this related question 以及已接受答案中的while (listing.isTruncated()) 方法中,另请参阅此newer answer 中的更新方法。
  • 您还可以查看 deleteObjects,它可以删除一批对象。
  • 告诉我我是否正确? isTruncuated 仅在发送部分响应时才需要,即如果有超过 1000 个对象,对吗?但如果我可以放心,在我的基本前缀中不会有超过 20-30 个对象,我可以简单地删除 while 循环吗?并删除我在一次通话中获得的所有对象列表? @安德鲁詹姆斯。
  • 主要问题是关于在 while 循环中检查 isTruncuated() 。 @jarmod。
  • "告诉我我是否正确“ - 我认为您应该能够自己测试。另外,您是否查看了不需要分页的较新答案中的示例?

标签: java amazon-web-services amazon-s3 aws-sdk-java-2.0 aws-s3-client


【解决方案1】:

使用时适用于 Java V2 的 AWS 开发工具包S3 客户端,您可以将代码设置为使用对象标识符要删除的对象。为每个要删除的对象在列表中添加一个新条目。在 ObjectIdentifier 键值中指定对象所在的路径。您可以在此处指定对象所在存储桶中的路径。

您需要填充列表与要删除的对象的数量。因此,如果您有 20 个对象 - 那么您需要向 List 添加 20 个条目,每个条目都有一个引用要删除的对象的有效键值。

然后打电话删除对象().这是删除许多对象的更简洁的方法。也就是说,您可以在 1 次调用而不是多次调用中删除多个对象。

请参阅此代码。

 public static void deleteBucketObjects(S3Client s3, String bucketName, String objectName) {

        ArrayList<ObjectIdentifier> toDelete = new ArrayList<>();
        toDelete.add(ObjectIdentifier.builder()
            .key(objectName)
            .build());

        try {
            DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
                .bucket(bucketName)
                .delete(Delete.builder()
                .objects(toDelete).build())
                .build();
            
            s3.deleteObjects(dor);

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

【讨论】:

  • 不,我认为您误解了这个问题,我需要删除文件夹中的对象,我写了多个对象,因为它们实际上不是文件夹,而是相同的前缀。我想知道是否有一种方法可以删除多个对象,而无需使用循环检查截断的列表。我想没有。所以我采用了上面提到的相同方法。
  • “删除文件夹中的对象” - 这正是上面代码显示的内容。但是 - 您在 ObjectIdentifier 键值中指定对象所在的路径。此逻辑在 1 个服务调用中删除多个对象,而不是循环并进行多次服务调用,一次删除一个对象 1。在上面的代码中,您需要使用要删除的对象数填充 LIST。因此,如果您有 20 个对象 - 那么您需要向 List 添加 20 个条目,每个条目都有一个有效的键值,
  • 但是我如何根据文件夹名称获取那些 n 个对象?为此我将不得不循环并检查直到 isTruncuated() 方法返回下降?我是对的还是我无法理解您提出的解决方案?
  • 如果您在名为 foo/foo2 的存储桶位置中有对象,则调用 ListObjects github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/…。然后您在该存储桶位置获取密钥并填充 ArrayList<ObjectIdentifier> toDelete List 对象并调用 s3.deleteObjects(dor)。
猜你喜欢
  • 2013-08-23
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2023-03-21
  • 2010-10-16
  • 2018-11-20
  • 2020-04-07
相关资源
最近更新 更多