Java 版本 2 的 AWS SDK - 删除 S3 "folder" 或删除多个 S3 对象
AWS SDK for Java version 2 - Delete S3 "folder" or Delete multiple S3 objects
我正在搜索如何使用适用于 Java 版本 2 的 AWS SDK 删除 S3 文件夹。我只找到了 AWS SDK 版本 1 示例。
我知道S3是一个对象存储,不存在文件夹的概念。我的意思是:
- 列出具有给定前缀的给定存储桶的 S3 对象
- 使用
DeleteObjectsRequest
删除返回的对象,以便能够在对 AWS 的单个 HTTP 调用中删除最多 1000 个对象 API
当我搜索示例时,我经常返回此页面:https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html 似乎这是使用的 Java 的 AWS SDK 版本 1。至少,在我这边,我导入了 AWS SDK 2,我无法直接实例化 DeleteObjectsRequest,如本例所示。我被迫使用构建器,然后我找不到相同的方法来指定要删除的键列表。
我设法让它与下面的代码一起工作。
但我发现这种做法很麻烦,我仍然想与社区核实一下这是否是正确的做法。我特别发现需要从 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);
}
}
这是对@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);
}
我正在搜索如何使用适用于 Java 版本 2 的 AWS SDK 删除 S3 文件夹。我只找到了 AWS SDK 版本 1 示例。
我知道S3是一个对象存储,不存在文件夹的概念。我的意思是:
- 列出具有给定前缀的给定存储桶的 S3 对象
- 使用
DeleteObjectsRequest
删除返回的对象,以便能够在对 AWS 的单个 HTTP 调用中删除最多 1000 个对象 API
当我搜索示例时,我经常返回此页面:https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html 似乎这是使用的 Java 的 AWS SDK 版本 1。至少,在我这边,我导入了 AWS SDK 2,我无法直接实例化 DeleteObjectsRequest,如本例所示。我被迫使用构建器,然后我找不到相同的方法来指定要删除的键列表。
我设法让它与下面的代码一起工作。
但我发现这种做法很麻烦,我仍然想与社区核实一下这是否是正确的做法。我特别发现需要从 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);
}
}
这是对@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);
}