Java sdk for awsを使用して、単一のAPIリクエストでフォルダー(S3バケット内)とそのすべてのコンテンツを削除することは可能ですか?ブラウザーコンソールの場合、単一のAPIリクエストでフォルダーとそのコンテンツを削除できますクリックすると、APIを使用しても同じ動作が利用できるようになることを願っています。
S3にはフォルダのようなものはありません。ファイル名にスラッシュが含まれているファイルがあります。
ブラウザコンソールはこれらのスラッシュをフォルダとして視覚化しますが、実際にはありません。
同じプレフィックスを持つすべてのファイルを削除できますが、最初にlist_objects()でそれらを検索する必要があり、次にそれらをバッチ削除できます。
Java sdkを使用するコードスニペットについては、以下のドキュメントを参照してください
http://docs.aws.Amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingJava.html
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;
}
}
}
ファイルを削除するために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);
}
あなたはこれを試すことができます
void deleteS3Folder(String bucketName, String folderPath) {
for (S3ObjectSummary file : s3.listObjects(bucketName, folderPath).getObjectSummaries()){
s3.deleteObject(bucketName, file.getKey());
}
}