2

我正在搜索如何使用 AWS SDK for Java 版本 2 删除 S3文件夹。我只设法找到 AWS SDK 版本 1 示例。

我知道 S3 是一个对象存储,并且不存在文件夹的概念。我的意思是:

  • 列出具有给定前缀的给定存储桶的 S3 对象
  • 使用 a 删除返回的对象DeleteObjectsRequest,以便能够在对 AWS API 的单个 HTTP 调用中删除多达 1000 个对象

当我在搜索示例时,我会经常返回此页面:https ://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html这似乎是适用于 Java 的 AWS 开发工具包的版本 1这是使用的。至少,就我而言,我导入了 AWS SDK 2,并且无法直接实例化DeleteObjectsRequest,如本示例所示。我被迫使用构建器然后我找不到相同的方法来指定要删除的键列表。

4

2 回答 2

2

我设法使它与下面的代码一起工作。

但我发现这种做法很麻烦,我仍然想与社区核实这是否是正确的做法。我特别发现从一个集合S3Object到一个集合ObjectIdentifier以及所需的构建器链的需要非常麻烦。为什么DeleteObjectsRequest构建器不允许简单地将字符串集合指定为要删除的对象的键?

public static void deleteS3Objects(String bucket, String prefix) {
    ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(bucket).prefix(prefix).build();
    ListObjectsV2Iterable list = s3Client.listObjectsV2Paginator(request);
    for (ListObjectsV2Response response : list) {
        List<S3Object> objects = response.contents();
        List<ObjectIdentifier> objectIdentifiers = objects.stream().map(o -> ObjectIdentifier.builder().key(o.key()).build()).collect(Collectors.toList());
        DeleteObjectsRequest deleteObjectsRequest = DeleteObjectsRequest.builder().bucket(bucket).delete(Delete.builder().objects(objectIdentifiers).build()).build();
        s3Client.deleteObjects(deleteObjectsRequest);
    }
}
于 2020-03-02T14:26:15.887 回答
1

这是对@Comencau 的有用答案的改进,它处理找不到对象的情况:MalformedXML: The XML you provided was not well-formed or did not validate against our published schema

public static void deleteS3Data(String bucket, String prefix) {
    S3Client s3Client = S3Client.builder().region(region).build();
    ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(bucket).prefix(prefix).build();
    ListObjectsV2Iterable list = s3Client.listObjectsV2Paginator(request);

    List<ObjectIdentifier> objectIdentifiers = list
            .stream()
            .flatMap(r -> r.contents().stream())
            .map(o -> ObjectIdentifier.builder().key(o.key()).build())
            .collect(Collectors.toList());

    if (objectIdentifiers.isEmpty()) return;
    DeleteObjectsRequest deleteObjectsRequest = DeleteObjectsRequest
            .builder()
            .bucket(bucket)
            .delete(Delete.builder().objects(objectIdentifiers).build())
            .build();
    s3Client.deleteObjects(deleteObjectsRequest);
}
于 2021-01-11T20:44:45.277 回答