有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

AmazonWebServicesAWSSDKforJavaVersion2删除S3“文件夹”或删除多个S3对象

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

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

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

当我搜索示例时,我经常返回到这个页面:https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html,这里似乎是所使用的AWS Java SDK的版本1。至少,在我这方面,我导入了AWS SDK 2,无法直接实例化DeleteObjectsRequest,如本例所示。我被迫使用生成器,然后我找不到相同的方法来指定要删除的键列表


共 (2) 个答案

  1. # 1 楼答案

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

    但我觉得这样做相当麻烦,我仍然想与社区核实这是否是正确的做法。我特别发现,从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);
        }
    }
    
  2. # 2 楼答案

    这是对@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);
    }