web-dev-qa-db-ja.com

フォルダとそのコンテンツを削除するAWSS3 java

Java sdk for awsを使用して、単一のAPIリクエストでフォルダー(S3バケット内)とそのすべてのコンテンツを削除することは可能ですか?ブラウザーコンソールの場合、単一のAPIリクエストでフォルダーとそのコンテンツを削除できますクリックすると、APIを使用しても同じ動作が利用できるようになることを願っています。

7
Munish Dhiman

S3にはフォルダのようなものはありません。ファイル名にスラッシュが含まれているファイルがあります。

ブラウザコンソールはこれらのスラッシュをフォルダとして視覚化しますが、実際にはありません。

同じプレフィックスを持つすべてのファイルを削除できますが、最初にlist_objects()でそれらを検索する必要があり、次にそれらをバッチ削除できます。

Java sdkを使用するコードスニペットについては、以下のドキュメントを参照してください

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

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;
            }
        }
    }

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

8
Nikolas

ファイルを削除するためにJava sdkにフォルダ名、より具体的にはプレフィックスを付けるオプションはありません。ただし、削除するキーの配列を指定するオプションはあります。 クリックして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
KESHAV KUMAR

あなたはこれを試すことができます

void deleteS3Folder(String bucketName, String folderPath) {
    for (S3ObjectSummary file : s3.listObjects(bucketName, folderPath).getObjectSummaries()){
        s3.deleteObject(bucketName, file.getKey());
    }
}
0
Vaibhav Rai