Amazon s3 使用AWS SDK V2删除对象?
我正在尝试从AWS SDK V1.x迁移到V2.2。不过,我想不出删除对象的方法。我发现了一堆示例-都是相同的:-(似乎从未使用要删除的对象列表(即列表存在,但从未在DeleteObjectsRequest对象中设置-我假设应该在那里设置,但看不到在哪里)。如何/在哪里提供对象列表?我发现的示例有:Amazon s3 使用AWS SDK V2删除对象?,amazon-s3,aws-sdk,aws-java-sdk-2.x,Amazon S3,Aws Sdk,Aws Java Sdk 2.x,我正在尝试从AWS SDK V1.x迁移到V2.2。不过,我想不出删除对象的方法。我发现了一堆示例-都是相同的:-(似乎从未使用要删除的对象列表(即列表存在,但从未在DeleteObjectsRequest对象中设置-我假设应该在那里设置,但看不到在哪里)。如何/在哪里提供对象列表?我发现的示例有: System.out.println("Deleting objects from S3 bucket: " + bucket_name); for (String k : obje
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);
}
看起来需要更多的对象来分配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);
}
要删除的键
删除对象
以前接受的答案非常有用,尽管它不是100%完整。我使用它编写了以下方法。它基本上可以工作,尽管我还没有测试它的错误处理能力
- 传入一个
键数组,这些键被转换为String
需要的deleteObjects
ObjectIdentifier
和s3Client
假定已在其他地方初始化。如果不需要,请随时删除日志记录log
- 该方法当前返回成功删除的次数
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; }
public int deleteS3Objects(字符串bucketName,字符串[]键){ List objIds=Arrays.stream(键) .map(key->ObjectIdentifier.builder().key(key).build()) .collect(Collectors.toList()); 试一试{ DeleteObjectsRequest dor=DeleteObjectsRequest.builder() .bucket(bucketName) .delete(delete.builder().objects(objIds.build()) .build(); DeleteObjectsResponse delResp=s3client.deleteObjects(dor); 如果(delResp.errors().size()>0){ String err=String.format(“%d个错误在删除%d个对象时返回”, delResp.errors().size(),objIds.size()); 日志警告(err); } if(delResp.deleted().size()
(免费评论:我觉得奇怪的是,在AWS SDK v2.3.9中,
deleteObjects
需要Delete.Builder
和ObjectIdentifier
键,但是getObject
和putObject
接受字符串键。为什么DeleteObjectsRequest.Builder
没有一个keys()
method?他们还没有正式表示SDK已经可以生产了,所以其中一些可能会发生变化。)请注意,v2是GA,可以生产使用: