Amazon S3 boto - come creare una cartella?


123

Come posso creare una cartella in un bucket utilizzando la botolibreria per Amazon s3?

Ho seguito il manuale e ho creato le chiavi con i permessi, i metadati, ecc., Ma non dove nella documentazione del boto viene descritto come creare cartelle in un bucket o creare una cartella in cartelle in bucket.


sembra che amazon s3 non abbia il concetto di cartella, alcuni suggeriscono di creare una chiave con un nome come "cartella / test.txt" per aggirare il problema. Ho provato a utilizzare il plug-in firefox s3 per creare una cartella ed elenca tutte le chiavi in ​​boto, il risultato è la cartella che ho appena creato come "<Key: vitoshares, everyone_ $ folder $>], quindi come posso visualizzare / aggiungere / modificare il contenuto in / da questa cartella?
vito huang

Nota: l'opzione dell'interfaccia di gestione di AWS S3 per la creazione di "cartelle" non è compatibile con S3FS, ovvero creare una "cartella" utilizzando l'interfaccia e provare a ottenere un elenco di detta cartella tramite il punto di montaggio S3FS.
jldupont

Nota 2: la creazione di una "cartella" tramite S3FS è tuttavia compatibile con l'interfaccia di gestione di AWS S3.
jldupont

Vedi la risposta @JaHax di seguito per un esempio di come farlo con Boto. Facile!
e.thompsy

Risposte:


134

Non esiste il concetto di cartelle o directory in S3. Puoi creare nomi di file come "abc/xys/uvw/123.jpg", che molti strumenti di accesso S3 come S3Foxmostrano come una struttura di directory, ma in realtà è solo un singolo file in un bucket.


1
grazie per la risposta, quindi immagino che se voglio vedere il contenuto di una particolare cartella, dovrò attraversare molti altri file non necessari?
vito huang

7
c'è un concetto molto ben definito di cartelle. la risposta non è corretta .. vedi la risposta di elranu sotto.
Boppity Bop

19
@ BoppityBop: non esiste il concetto di cartelle in S3 . S3 non ha cartelle, anche se la console di gestione e molti strumenti rappresentano le chiavi con barre in quanto tali. Consulta Lavorare con le cartelle e leggi la parte: "Quindi la console utilizza i nomi delle chiavi degli oggetti per presentare cartelle e gerarchie. In Amazon S3, hai solo bucket e oggetti. "
Antti Haapala

7
Potrebbe non essere tecnicamente una cartella, ma sembra esserci sicuramente il supporto per le cartelle. Nella console di aws quando guardi un bucket puoi fare clic su "Crea cartella" e ne creerà una, che possono essere vuote e estrarre i metadati da essi.
phazei

4
S3 è un gigantesco archivio di valori-chiave DynamoDB personalizzato. Alcuni strumenti (inclusa la console Web AWS) forniscono alcune funzionalità che imitano un albero di directory, ma lavorerai su S3 invece di lavorarci se le tue applicazioni presumono che sia equivalente a un file system. Rinominare quella che sembra essere una directory, ad esempio, richiede la scansione dello spazio delle chiavi e la modifica di ogni chiave contenente il "nome della directory" in questione. D'altra parte, essendo un archivio di valori-chiave, non è necessario creare "directory padre" o pulire "cartelle vuote", cosa che per imitare un file system richiederebbe
scooter-dangle

51

Supponi di voler creare la cartella abc / 123 / nel tuo secchio, è un gioco da ragazzi con Boto

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

Oppure usa la console


7
Questa è la risposta corretta. È possibile con Boto ed è così che lo fai. In realtà new_key()è tutto ciò di cui hai bisogno. La stringa inviata alla funzione potrebbe essere abc/123/o abc/123/newfile.txt. Qualunque cosa tu preferisca. Mi piace racchiudere questo in un'istruzione if dopo aver cercato di ottenere ciò che spero sia lì in questo modo: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Essenzialmente, se non è lì, crealo!
e.thompsy

1
Con l'ultima API, anche bucket.key ('abc / 123 /') otterrà lo stesso risultato.
light94

La specifica di una chiave di directory funziona anche con il caricamento di file in caricamenti in più parti mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

Con AWS SDK .Net funziona perfettamente, basta aggiungere "/" alla fine della stringa del nome della cartella:

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);

Quindi aggiorna la tua console AWS e vedrai la cartella


Ho appena provato con la libreria ruby ​​di AWS :: S3. Crea una "cartella" con un file con un nome di file vuoto al suo interno ... Quindi non funziona davvero. La soluzione di Mohammad Asgari però funziona bene!
Nico

@Nico ma hai terminato il nome del file con una "/", proprio come dice il commento in codice?
elranu

Sì, ho aggiunto la barra. Ho fatto AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

Emesso "putObject" usando una stringa vuota e una barra all'estremità ha funzionato per me. Sto usando PHP con la libreria tpyo / amazon-s3-php-class.
MikeMurko

2
@BoppityBop sì, ha un pulsante di creazione della cartella, ma probabilmente anche questo crea una sorta di file vuoto
jamylak

15

Usa questo:

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+'/'))

Grazie per l'aiuto, ricevo sotto l'errore. potete aiutarmi per favore .botocore.exceptions.NoCredentialsError: Impossibile individuare le credenziali
Anvesh

1
Devi specificare le tue credenziali aws in un modo o nell'altro. Controlla questo: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

Grazie! Questo ha funzionato molto bene per me
:)


4

È davvero facile creare cartelle. In realtà si tratta solo di creare chiavi.

Puoi vedere il mio codice qui sotto che stavo creando una cartella con utc_time come nome.

Ricorda che termina la chiave con "/" come sotto, questo indica che è una chiave:

Chiave = "cartella1 /" + 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

Aggiornamento per il 2019, se vuoi creare una cartella con il percorso nome_bicchiere / cartella1 / cartella2 puoi usare questo codice:

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

Anche se puoi creare una cartella aggiungendo "/" al tuo nome_cartella. Sotto il cofano, S3 mantiene una struttura piatta a differenza del normale NFS.

var params = {
            Bucket: bucketName,
            Chiave: nomeCartella + "/"
        };
s3.putObject (params, function (err, data) {});

1

Ho provato molti metodi sopra e l'aggiunta di una barra /alla fine del nome della chiave, per creare la directory non ha funzionato per me:

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

È necessario fornire un Bodyparametro per creare la directory:

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

Fonte: ryantuck nell'edizione di boto3


0

S3 non ha una struttura di cartelle, ma c'è qualcosa chiamato chiavi.

Possiamo creare /2013/11/xyz.xlse verrà mostrato come cartella nella console. Ma la parte di archiviazione di S3 lo prenderà come nome del file.

Anche durante il recupero osserviamo che possiamo vedere i file in una particolare cartella (o chiavi) usando il ListObjectsmetodo e usando il Prefixparametro.


0

Apparentemente ora puoi creare cartelle in S3. Non sono sicuro da quando, ma ho un bucket nella zona "Standard" e posso scegliere Crea cartella dal menu a discesa Azione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.