是否可以使用java sdk为aws删除文件夹(在S3存储桶中)及其所有内容的单个api请求。对于浏览器控制台,我们只需单击即可删除文件夹及其内容,我希望使用API也可以使用相同的行为。
答案 0 :(得分:4)
S3中没有文件夹这样的东西;文件名中只有带斜杠的文件。
浏览器控制台会将这些斜杠显示为文件夹,但它们并不真实。
您可以删除所有具有相同前缀的文件,但首先您需要使用list_objects()查找它们,然后您可以批量删除它们。
有关使用Java sdk的代码段,请参阅下面的文档
http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html
答案 1 :(得分:4)
您可以在ListObjectsRequest中指定keyPrefix。
例如,考虑一个包含以下键的存储桶:
您要从 foo / bar / baz 中删除文件。
if (s3Client.doesBucketExist(bucketName)) {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withPrefix("foo/bar/baz");
ObjectListing objectListing = s3Client.listObjects(listObjectsRequest);
while (true) {
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
s3Client.deleteObject(bucketName, objectSummary.getKey());
}
if (objectListing.isTruncated()) {
objectListing = s3Client.listNextBatchOfObjects(objectListing);
} else {
break;
}
}
}
答案 2 :(得分:0)
在Java sdk中无法选择提供文件夹名称或更具体的前缀来删除文件。但是,可以选择提供要删除的键数组。 Click for details 。 通过使用此方法,我编写了一个小方法来删除与前缀相对应的所有文件。
private AmazonS3 s3client = <Your s3 client>;
private String bucketName = <your bucket name, can be signed or unsigned>;
public void deleteDirectory(String prefix) {
ObjectListing objectList = this.s3client.listObjects( this.bucketName, prefix );
List<S3ObjectSummary> objectSummeryList = objectList.getObjectSummaries();
String[] keysList = new String[ objectSummeryList.size() ];
int count = 0;
for( S3ObjectSummary summery : objectSummeryList ) {
keysList[count++] = summery.getKey();
}
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest( bucketName ).withKeys( keysList );
this.s3client.deleteObjects(deleteObjectsRequest);
}
答案 3 :(得分:0)
您可以尝试
void deleteS3Folder(String bucketName, String folderPath) {
for (S3ObjectSummary file : s3.listObjects(bucketName, folderPath).getObjectSummaries()){
s3.deleteObject(bucketName, file.getKey());
}
}