删除文件夹及其内容AWS S3 java

Mun*_*man 5 java amazon-s3 amazon-web-services aws-sdk-java-2.0

是否可以使用java sdk为aws删除文件夹(在S3存储桶中)及其所有内容的单个api请求.对于浏览器控制台,我们只需单击即可删除文件夹及其内容,我希望使用API​​也可以使用相同的行为.

KES*_*MAR 10

java sdk 中没有提供文件夹名称或更具体的前缀来删除文件的选项。但是可以选择提供要删除的键数组。 点击查看更多细节 。通过使用这个,我编写了一个小方法来删除与某个前缀对应的所有文件。

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的对象位于页面限制内,则效果很好。否则需要对结果执行所有“isTruncated()”/实现分页。 (2认同)

Ami*_*wal 6

S3中没有文件夹。文件名中仅包含带斜杠的文件。

浏览器控制台会将这些斜线可视化为文件夹,但不是真实的。

您可以删除具有相同前缀的所有文件,但首先需要使用list_objects()查找它们,然后可以批量删除它们。

有关使用Java SDK的代码段,请参阅以下文档

http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html

  • 感谢您的回复,我已经在使用 listObject 和批量删除的东西了。获取和删除是一个漫长的过程:( (2认同)

Nik*_*las 6

您可以在ListObjectsRequest中指定keyPrefix。

例如,考虑一个包含以下键的存储桶:

  • foo / bar / baz
  • foo / bar / bash
  • foo / bar / bang
  • foo / boo

而且您想从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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ListObjectsRequest.html

  • 里面的文件被删除后,如何删除baz文件夹?你使用 `s3Client.deleteObject(bucketName, "foo/bar/baz");` 吗? (3认同)
  • 请注意,这可能会花费很长时间,因为您要为每个对象发送一个请求,如果您有很多文件,最好使用“DeleteObjectsRequest”。 (3认同)