私は、いわゆるすべてのリストにしようとしているfolders
とsub-folders
してs3
バケット。今、私は再帰的に私が使用していないパスにすべてのフォルダを一覧表示しようとしているとしてwithDelimeter()
の機能を。すべてのいわゆるfolder
名がで終わらなければならない/
、これはすべてのフォルダとサブフォルダの一覧を表示するために私のロジックです。
ここだscala
コードは(意図的に貼り付けていないcatch
ここにコード):
val awsCredentials = new BasicAWSCredentials(awsKey, awsSecretKey)
val client = new AmazonS3Client(awsCredentials)
def listFoldersRecursively(bucketName: String, fullPath: String): List[String] = {
try {
val objects = client.listObjects(bucketName).getObjectSummaries
val listObjectsRequest = new ListObjectsRequest()
.withPrefix(fullPath)
.withBucketName(bucketName)
val folderPaths = client
.listObjects(listObjectsRequest)
.getObjectSummaries()
.map(_.getKey)
folderPaths.filter(_.endsWith("/")).toList
}
}
ここで私は、この使用して取得しています、リストのscala
コードは、
任意の明白なパターンがなければ、多くのフォルダは、検索フォルダのリストから欠落しています。私は使用しませんでした
client.listObjects(listObjectsRequest).getCommonPrefixes.toList
それが何らかの理由で空のリストを返していましたので。
PS:ので、新しいユーザーであることの直接ポストに写真を追加できませんでした。
任意の明白なパターンがなければ、多くのフォルダは、検索フォルダのリストから欠落しています。
ここにあなたの問題があります:あなたは常にで終わるキーを持つオブジェクトが存在すべきであると仮定されている/
シンボル化フォルダへ。
これは間違った仮定です。あなたはどちらかS3コンソールまたはAPIを介して、それらを作成したなら、彼らにのみ存在します。S3は、実際にそれらを必要とするか、何のためにそれらを使用すると、S3サービスは、自然に自分自身をそれらを作成しないしないようにそれらを期待する理由は、ありません。
あなたがキーを持つオブジェクトをアップロードするAPIを使用している場合foo/bar.txt
、これは作成しないfoo/
個別のオブジェクトとしてフォルダを。これは、利便性のために、コンソールにフォルダとして表示されますが、いくつかの点で、あなたが意図的にそれを作成しない限り、それはありません。
しかし-もちろん、コンソールでこのようなオブジェクトをアップロードする唯一の方法は、それがすでに表示されていない限りフォルダ「を作成」にあるコンソールに表示されますが、必ずしも一致しない個別のオブジェクトとして存在します。
上のフィルタリングはendsWith("/")
無効ロジックです。
基礎となるAPIが含まれる理由はここにあるCommonPrefixes
場合は、各ListObjects応答とdelimiter
してprefix
指定されています。これは再帰的に次のレベルを見つけるためにドリルダウンする必要があり、「フォルダ」の次のレベルのリストです。
あなたは接頭辞を指定した場合は、接頭辞と接頭辞の後に区切り文字の最初の発生と同じ文字列を含むすべてのキーがCommonPrefixesと呼ばれる単一の結果要素の下にグループ化されています。あなたは、キーの先頭にサブストリングを開始しprefixパラメータを指定しない場合。CommonPrefixes結果要素の下にグループ化されたキーは、応答の他の場所に戻されていません。
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
あなたは、キーのリスト全体を反復する必要があり、上の実際の共通の接頭辞を発見、どんなライブラリあなたや使用してこの機能にアクセスする必要がある、または/
文字列の分割を使用して境界を。