1
votes

Vérifiez si le chemin est le fichier Amazon S3

J'ai une fonctionnalité pour répertorier les répertoires AWS S3 avec Scala et je voudrais vérifier si le chemin indiqué est un fichier ou un répertoire. Comment puis-je implémenter cette fonctionnalité (méthode isFile) en utilisant amazon-sdk-s3?

Voici à quoi cela ressemble:

  def listContents(): Seq[T] =
    val paths = s3Client.list(inputPath)
    for {
      path <- paths if isFile(new Path(path)).getOrElse(false)
      res <- transform(path.toString)
    } yield res

def isFile(path: String) = ??? //implementation I need


0 commentaires

3 Réponses :


3
votes

Amazon S3 n'a pas le concept de «répertoire».

Au lieu de cela, le chemin complet d'un objet est stocké dans sa clé (nom de fichier).

Par exemple, un objet peut être stocké dans Amazon S3 avec une clé de: invoices/2020-09/inv22.txt

Cet objet peut être créé même si les répertoires factures et 2020-09 n'existent pas. Lorsqu'il est visualisé via la console Amazon S3, il apparaîtra comme si ces répertoires avaient été créés automatiquement, mais si l'objet est supprimé, ces répertoires disparaîtront (car ils n'ont jamais existé).

Si un utilisateur clique sur le bouton "Créer un dossier" dans la console de gestion Amazon S3, un objet de longueur nulle est créé avec le même nom que le dossier . Cela «force» le dossier à apparaître même s'il n'y a aucun objet «à l'intérieur» du dossier. Cependant, ce n'est pas réellement un dossier.

Par conséquent, il n'est pas possible de "vérifier si le chemin indiqué est un fichier ou un répertoire" car les répertoires n'existent pas. Au lieu de cela, je vous recommande de supposer que tout est un "fichier" à moins qu'il ne soit de longueur nulle .


0 commentaires

2
votes

S3 n'a pas la notion de dossiers couramment trouvés dans les systèmes de fichiers, mais a plutôt une structure plate, plus de détails peuvent être trouvé ici .

De manière générale, les éléments qui ne se terminent pas par" / "doivent être traités comme des objets mais, alors que le Web AWS La console ne vous permet pas de télécharger des fichiers se terminant par "/", cela est possible via SDK / API:

La console Amazon S3 traite tous les objets comportant une barre oblique ("/") comme le dernier caractère (de fin) du nom de clé comme un dossier, par exemple examplekeyname / . Vous ne pouvez pas télécharger un objet qui a un nom de clé avec un caractère «/» de fin à l'aide de la console Amazon S3. Cependant, vous pouvez télécharger des objets nommés avec un "/" à la fin avec l'API Amazon S3 à l'aide de l'AWS CLI, des kits SDK AWS ou de l'API REST.

L'autre réponse suggère de supposer que tout est un fichier à moins qu'il ne soit de longueur nulle, c'est une bonne suggestion mais se séparera au cas où certains de vos fichiers devraient être vides (mais vous devez toujours les traiter ), ci-dessous un exemple des métadonnées de réponse renvoyées par un fichier txt vide que je viens de télécharger et que j'ai essayé de récupérer:

{
  "HTTPHeaders": {
    "accept-ranges": "bytes",
    "content-length": "0",
    "content-type": "text/plain",
    "date": "Mon, 14 Sep 2020 10:14:29 GMT",
    "etag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "last-modified": "Mon, 14 Sep 2020 10:13:52 GMT",
    "x-amz-server-side-encryption": "AES256"
  },
  "HTTPStatusCode": 200,
  "RetryAttempts": 0
}

Selon la façon dont vous parcourez / listez vos objets, il y a de fortes chances que que la réponse n'inclut déjà que des objets, mais en cas d'ambiguïté, je vous suggère de toujours essayer de récupérer l'objet et d'être prêt à gérer une exception. Si vous essayez de récupérer une clé qui est un dossier, Amazon S3 renverra une erreur de code d'état HTTP 404 ("no such key") - Docs ici .


0 commentaires

-1
votes

Il est possible de vérifier si un dossier existe. Ce que j'ai fait, c'est d'utiliser listObjectV2 pour cela.

Quelques astuces ici

  1. Ajouter «/» au nom du dossier, puis le transmettre à listObjectV2.
  2. Le paramètre de retour maximal des articles est de 1

Lorsque vous avez récupéré les objets de liste, vous pouvez facilement vérifier si l'objet (dossier) existe ou non.

Je mettrai à jour un peu mon code quand j'aurai le temps.


0 commentaires