1. ホーム
  2. java

[解決済み] AWS S3バケットの特定の "フォルダ "にあるファイルをリストアップする

2023-06-05 09:18:58

質問

S3バケットに含まれる特定のフォルダに含まれるすべてのファイルをリストアップする必要があります。

フォルダの構造は以下の通りです。

/my-bucket/users/<user-id>/contacts/<contact-id>

ユーザーに関連するファイルと、あるユーザーの連絡先に関連するファイルがあります。 両方をリストアップする必要があります。

ファイルをリストアップするために、私はこのコードを使っています。

ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("my-bucket")
                .withPrefix("some-prefix").withDelimiter("/");
ObjectListing objects = transferManager.getAmazonS3Client().listObjects(listObjectsRequest);

特定のユーザーのファイルをリストアップするために、このプレフィックスを使っています。

users/<user-id>/

を除いたディレクトリにあるすべてのファイルを正しく取得しています。 contacts といったサブディレクトリを除いたディレクトリにあるすべてのファイルを正しく取得しています。

users/<user-id>/file1.txt
users/<user-id>/file2.txt
users/<user-id>/file3.txt

特定のユーザーコンタクトのファイルをリストアップするために、代わりにこのプレフィックスを使用しています。

users/<user-id>/contacts/<contact-id>/

しかし、この場合、返されるオブジェクトとして ディレクトリ自体も返されます。

users/<user-id>/contacts/<contact-id>/file1.txt
users/<user-id>/contacts/<contact-id>/file2.txt
users/<user-id>/contacts/<contact-id>/

なぜこのような動作になるのでしょうか?2 つのリスト要求の間で何が違うのですか? 私は、サブディレクトリを除いて、ディレクトリ内のファイルのみを一覧表示する必要があります。

どのように解決するのですか?

S3では、すべてがオブジェクトです。あなたにとって、それはファイルやフォルダーかもしれない。しかし、S3にとって、それらはただのオブジェクトである。

デリミターで終わるオブジェクト( / で終わるオブジェクトは、通常フォルダとして認識されますが、必ずしもそうとは限りません。それはアプリケーションによります。繰り返しになりますが、あなたの場合、フォルダと解釈していますね。S3はそうではありません。ただの別のオブジェクトです。

上のあなたのケースでは、オブジェクト users/<user-id>/contacts/<contact-id>/ は別個のオブジェクトとしてS3内に存在しますが、オブジェクト users/<user-id>/ は存在しません。それが皆さんの反応の違いです。なぜそうなっているのかは、私たちにはわかりませんが、誰かが一方ではオブジェクトを作り、他方では作っていないのです。AWSマネジメントコンソールで見えないのは、コンソールがフォルダと解釈して隠しているからです。

S3はこれらのものをオブジェクトとして見ているだけなので、あなたのために特定のものを"exclude"することはないでしょう。オブジェクトをどう扱うかは、クライアント次第です。

あなたのソリューション

フォルダオブジェクトを必要としないのはあなた自身なので、最後の文字が / . もしそうなら、そのオブジェクトをレスポンスから無視します。