Amazon S3 boto - comment créer un dossier?


123

Comment puis-je créer un dossier sous un compartiment à l'aide de la botobibliothèque pour Amazon s3?

J'ai suivi le manuel et créé les clés avec autorisation, métadonnées, etc., mais nulle part dans la documentation du boto, il ne décrit comment créer des dossiers sous un seau, ou créer un dossier sous des dossiers dans un seau.


il semble que Amazon s3 n'a pas de concept de dossier, certains suggèrent de créer une clé avec un nom comme "dossier / test.txt 'pour le contourner. J'ai essayé d'utiliser le plugin firefox s3 pour créer un dossier, et lister toutes les clés dans boto, il sort le dossier que je viens de créer en tant que "<Clé: vitoshares, tout le monde_ $ dossier $>], alors comment puis-je afficher / ajouter / modifier du contenu vers / depuis ce dossier?
vito huang

Remarque: l'option d'interface de gestion AWS S3 pour créer des «dossiers» n'est pas compatible avec S3FS, c'est-à-dire créer un «dossier» en utilisant l'interface et essayer d'obtenir une liste dudit dossier via le point de montage S3FS.
jldupont

Remarque 2: la création d'un «dossier» via S3FS est cependant compatible avec l'interface AWS S3 Management.
jldupont

Voir la réponse @JaHax ci-dessous pour un exemple de comment faire cela avec Boto. Facile!
e.thompsy

Réponses:


134

Il n'y a pas de concept de dossiers ou de répertoires dans S3. Vous pouvez créer des noms de fichiers tels que "abc/xys/uvw/123.jpg", que de nombreux outils d'accès S3 tels que S3Foxmontrent comme une structure de répertoires, mais il ne s'agit en réalité que d'un seul fichier dans un compartiment.


1
merci pour la réponse, donc je suppose que si je veux voir le contenu d'un dossier particulier, j'aurai besoin de parcourir beaucoup d'autres fichiers inutiles?
vito huang

7
il existe un concept très bien défini de dossiers. la réponse est incorrecte .. voir la réponse elranu ci-dessous.
Boppity Bop

19
@BoppityBop: Il n'y a pas de concept de dossiers dans S3 . S3 n'a pas de dossiers, même si la console de gestion et de nombreux outils représentent des clés avec des barres obliques en tant que telles. Consultez Utilisation des dossiers et lisez la partie: «La console utilise donc les noms de clé d'objet pour présenter les dossiers et la hiérarchie. Dans Amazon S3, vous n'avez que des compartiments et des objets. »
Antti Haapala

7
Ce n'est peut-être pas techniquement un dossier, mais il semble certainement y avoir un support de dossier. Dans la console aws, lorsque vous regardez un compartiment, vous pouvez cliquer sur "Créer un dossier" et il en créera un, et ils peuvent être vides et en extraire des métadonnées.
phazei du

4
S3 est un magasin de valeurs clés DynamoDB personnalisé géant. Certains outils (y compris la console Web AWS) fournissent des fonctionnalités qui imitent une arborescence de répertoires, mais vous travaillerez sur S3 plutôt que de travailler avec lui si vos applications supposent qu'il est équivalent à un système de fichiers. Renommer ce qui semble être un répertoire, par exemple, nécessite de parcourir l'espace de clés et de modifier chaque clé contenant le «nom de répertoire» en question. D'autre part, étant un magasin de valeurs clés, il n'est pas nécessaire de créer des `` répertoires parents '' ou de nettoyer des `` dossiers vides '', ce qui imiterait un système de fichiers
scooter-dangle

51

Supposons que vous vouliez créer le dossier abc / 123 / dans votre seau, c'est un jeu d'enfant avec Boto

k = bucket.new_key('abc/123/')
k.set_contents_from_string('')

Ou utilisez la console


7
C'est la bonne réponse. C'est possible avec Boto et c'est ainsi que vous le faites. En fait, new_key()c'est tout ce dont vous avez besoin. La chaîne envoyée à la fonction peut être abc/123/ou abc/123/newfile.txt. Ce que tu préfères. J'aime envelopper ceci dans une déclaration if après avoir essayé d'obtenir ce que j'espère être là comme ceci: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Essentiellement, si ce n'est pas là, créez-le!
e.thompsy

1
Avec la dernière API, bucket.key ('abc / 123 /') obtiendra également le même résultat.
light94

La spécification d'une clé de répertoire fonctionne également avec le téléchargement de fichiers dans les téléchargements en plusieurs mp = self._bucket.initiate_multipart_upload(bucket_key)
parties

20

Avec AWS SDK .Net fonctionne parfaitement, ajoutez simplement "/" à la fin de la chaîne de nom de dossier:

var folderKey =  folderName + "/"; //end the folder name with "/"
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey);
var request = new PutObjectRequest();
request.WithBucketName(AWSBucket);
request.WithKey(folderKey);
request.WithContentBody(string.Empty);
S3Response response = client.PutObject(request);

Ensuite, actualisez votre console AWS et vous verrez le dossier


J'ai juste essayé cela avec la bibliothèque ruby ​​AWS :: S3. Il crée un "dossier" avec un fichier avec un nom de fichier vide ... Donc ça ne marche pas vraiment. La solution de Mohammad Asgari fonctionne bien cependant!
Nico

@Nico mais avez-vous terminé le nom de fichier par un "/", comme le dit le commentaire du code?
elranu

Oui, j'ai ajouté la barre oblique. J'ai fait AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

J'ai publié "putObject" en utilisant une chaîne vide et une barre oblique à la fin. J'utilise PHP avec la bibliothèque tpyo / amazon-s3-php-class.
MikeMurko

2
@BoppityBop oui, il a un bouton de création de dossier, mais cela crée probablement une sorte de fichier vide également
jamylak

15

Utilisez ceci:

import boto3
s3 = boto3.client('s3')
bucket_name = "YOUR-BUCKET-NAME"
directory_name = "DIRECTORY/THAT/YOU/WANT/TO/CREATE" #it's name of your folders
s3.put_object(Bucket=bucket_name, Key=(directory_name+'/'))

Merci pour l'aide, je reçois une erreur ci-dessous. pouvez-vous s'il vous plaît m'aider .botocore.exceptions.NoCredentialsError: Impossible de localiser les informations d'identification
Anvesh

1
Vous devez spécifier vos informations d'identification aws d'une manière ou d'une autre. Vérifiez ceci: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

Merci! Cela a très bien fonctionné pour moi
:)


4

Il est vraiment facile de créer des dossiers. En fait, il s'agit simplement de créer des clés.

Vous pouvez voir mon code ci-dessous, je créais un dossier avec utc_time comme nom.

Souvenez-vous qu'il termine la clé par '/' comme ci-dessous, cela indique que c'est une clé:

Clé = 'dossier1 /' + utc_time + '/'

client = boto3.client('s3')
utc_timestamp = time.time()


def lambda_handler(event, context):

    UTC_FORMAT = '%Y%m%d'
    utc_time = datetime.datetime.utcfromtimestamp(utc_timestamp)
    utc_time = utc_time.strftime(UTC_FORMAT)
    print 'start to create folder for => ' + utc_time

    putResponse = client.put_object(Bucket='mybucketName',
                                    Key='folder1/' + utc_time + '/')

    print putResponse

4

Mise à jour pour 2019, si vous souhaitez créer un dossier avec le chemin bucket_name / folder1 / folder2, vous pouvez utiliser ce code:

from boto3 import client, resource

class S3Helper:

  def __init__(self):
      self.client = client("s3")
      self.s3 = resource('s3')

  def create_folder(self, path):
      path_arr = path.rstrip("/").split("/")
      if len(path_arr) == 1:
          return self.client.create_bucket(Bucket=path_arr[0])
      parent = path_arr[0]
      bucket = self.s3.Bucket(parent)
      status = bucket.put_object(Key="/".join(path_arr[1:]) + "/")
      return status

s3 = S3Helper()
s3.create_folder("bucket_name/folder1/folder2)

1

Bien que vous puissiez créer un dossier en ajoutant "/" à votre nom_dossier. Sous le capot, S3 maintient une structure plate contrairement à votre NFS habituel.

var params = {
            Bucket: bucketName,
            Clé: nom_dossier + "/"
        };
s3.putObject (paramètres, fonction (err, données) {});

1

J'ai essayé de nombreuses méthodes ci-dessus et l'ajout d'une barre oblique /à la fin du nom de la clé, pour créer un répertoire ne fonctionnait pas pour moi:

client.put_object(Bucket="foo-bucket", Key="test-folder/")

Vous devez fournir un Bodyparamètre pour créer un répertoire:

client.put_object(Bucket='foo-bucket',Body='', Key='test-folder/')

Source: ryantuck dans le numéro de boto3


0

S3 n'a pas de structure de dossiers, mais il y a quelque chose qui s'appelle des clés.

Nous pouvons créer /2013/11/xyz.xlset seront affichés comme des dossiers dans la console. Mais la partie stockage de S3 prendra cela comme nom de fichier.

Même lors de la récupération, nous observons que nous pouvons voir des fichiers dans un dossier particulier (ou des clés) en utilisant la ListObjectsméthode et en utilisant le Prefixparamètre.


0

Apparemment, vous pouvez maintenant créer des dossiers dans S3. Je ne sais pas depuis quand, mais j'ai un compartiment dans la zone "Standard" et je peux choisir Créer un dossier à partir du menu déroulant Action.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.