Liste des fichiers dans un "dossier" spécifique d'un compartiment AWS S3
J'ai besoin de la liste de tous les fichiers contenus dans un dossier précis contenus dans mon compartiment S3.
La structure de dossier est la suivante
/my-bucket/users/<user-id>/contacts/<contact-id>
J'ai des fichiers concernant les utilisateurs et les fichiers liés à un certain contact de l'utilisateur.
J'ai besoin de la liste à la fois.
À la liste des fichiers, je suis en utilisant ce code:
ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("my-bucket")
.withPrefix("some-prefix").withDelimiter("/");
ObjectListing objects = transferManager.getAmazonS3Client().listObjects(listObjectsRequest);
À la liste un certain fichiers de l'utilisateur, je suis en utilisant ce préfixe:
users/<user-id>/
et je suis correctement l'obtention de tous les fichiers dans le répertoire à l'exclusion de contacts
sous-répertoire, par exemple:
users/<user-id>/file1.txt
users/<user-id>/file2.txt
users/<user-id>/file3.txt
À la liste un certain utilisateur de contacter les fichiers au lieu de cela, je suis en utilisant ce préfixe:
users/<user-id>/contacts/<contact-id>/
mais dans ce cas, je suis aussi l'
répertoire lui-même comme un objet retourné:
users/<user-id>/contacts/<contact-id>/file1.txt
users/<user-id>/contacts/<contact-id>/file2.txt
users/<user-id>/contacts/<contact-id>/
Pourquoi suis-je ce comportement? Ce qui est différent entre les deux demandes? J'ai besoin de lister les fichiers dans le répertoire, à l'exclusion des sous-répertoires.
source d'informationauteur davioooh
Vous devez vous connecter pour publier un commentaire.
Tout dans S3 est un objet. Pour vous, il peut être des fichiers et des dossiers. Mais pour S3, ils sont juste des objets.
Objets qui se terminent avec le séparateur (
/
dans la plupart des cas) sont généralement perçu comme un dossier, mais il n'est pas toujours le cas. Il dépend de l'application. Encore une fois, dans votre cas, vous êtes interpretting comme un dossier. S3 ne l'est pas. C'est juste un autre objet.Dans votre cas ci-dessus, l'objet
users/<user-id>/contacts/<contact-id>/
existe en S3 en tant que distincte de l'objet, mais l'objetusers/<user-id>/
ne le fait pas. C'est la différence dans vos réponses. Pourquoi ils sont comme ça, nous ne pouvons pas vous dire, mais quelqu'un a fait l'objet, dans un cas, et n'a pas dans l'autre. Vous ne le voyez pas dans AWS Management Console, parce que la console est en l'interprétant comme un dossier et de le cacher.Depuis S3 voit juste ces choses comme des objets, il ne sera pas "exclure" certaines choses pour vous. C'est au client de traiter les objets comme ils doivent être traités.
Votre Solution
Puisque vous êtes celui qui ne veut pas que le dossier des objets, vous pouvez l'exclure vous-même en regardant le dernier caractère pour un
/
. Si c'est le cas, ignorez l'objet de la réponse.Alors que tout le monde dire qu'il n'y a pas de répertoires et de fichiers dans la s3, mais uniquement des objets (et des seaux), ce qui est absolument vrai, je vous suggère de profiter de CommonPrefixes, décrit dans cette réponse.
Ainsi, vous pouvez effectuer les opérations suivantes pour obtenir la liste des "dossiers" (commonPrefixes) et "fichiers" (objectSummaries):
Dans votre cas, pour objectSummaries (fichiers) il doit retourner (dans le cas du préfixe correct):
users/user-id/contacts/contact-id/file1.txt
users/user-id/contacts/contact-id/file2.txt
pour commonPrefixes:
utilisateurs/nom d'utilisateur/contacts/contact-id/
S3 n'a pas de répertoires, tandis que vous pouvez afficher la liste des fichiers dans un pseudo répertoire, comme vous l'a démontré, il n'y a pas de répertoire "fichier" per se.
Vous pouvez par inadvertance créé un fichier de données appelé
users/<user-id>/contacts/<contact-id>/
.vous pouvez vérifier le type. s3 a un spécial application/x-répertoire