Amazon S3 boto: ¿cómo crear una carpeta?


123

¿Cómo puedo crear una carpeta en un depósito usando la botobiblioteca para Amazon s3?

Seguí el manual y creé las claves con permiso, metadatos, etc., pero en ninguna parte de la documentación del boto se describe cómo crear carpetas en un cubo o crear una carpeta en carpetas en un cubo.


parece que amazon s3 no tiene el concepto de carpeta, algunos sugieren crear una clave con un nombre como "carpeta / test.txt" para evitarlo. Intenté usar el complemento firefox s3 para crear una carpeta y enumerar todas las claves en boto, da como resultado la carpeta que acabo de crear como "<Key: vitoshares, Everyone_ $ folder $>], entonces, ¿cómo puedo ver / agregar / modificar contenido a / desde esta carpeta?
vito huang

Nota: la opción de la interfaz de administración de AWS S3 para crear "carpetas" no es compatible con S3FS, es decir, cree una "carpeta" usando la interfaz e intente obtener una lista de dicha carpeta a través del punto de montaje S3FS.
jldupont

Nota 2: la creación de una "carpeta" a través de S3FS es compatible con la interfaz de administración de AWS S3.
jldupont

Consulte la respuesta de @JaHax a continuación para ver un ejemplo de cómo hacer esto con Boto. ¡Fácil!
e.thompsy

Respuestas:


134

No existe el concepto de carpetas o directorios en S3. Puede crear nombres de archivo como "abc/xys/uvw/123.jpg", que muchas herramientas de acceso de S3 S3Foxmuestran como una estructura de directorio, pero en realidad es solo un archivo en un depósito.


1
gracias por la respuesta, así que supongo que si quiero ver el contenido de una carpeta en particular, tendré que atravesar muchos otros archivos innecesarios.
vito huang

7
hay un concepto de carpetas muy bien definido. la respuesta es incorrecta .. ver la respuesta de elranu a continuación.
Boppity Bop

19
@BoppityBop: No existe el concepto de carpetas en S3 . S3 no tiene carpetas, aunque la consola de administración y muchas herramientas representan claves con barras como tales. Consulte Trabajar con carpetas y lea la parte: "Entonces, la consola usa nombres de clave de objeto para presentar carpetas y jerarquías. En Amazon S3, solo tiene depósitos y objetos "
Antti Haapala

7
Puede que técnicamente no sea una carpeta, pero definitivamente parece haber soporte para carpetas. En la consola de AWS, cuando mira un depósito, puede hacer clic en "Crear carpeta" y creará una, y pueden estar vacíos y extraer metadatos de ellos.
phazei

4
S3 es un almacén de valores-clave de DynamoDB gigante y personalizado. Algunas herramientas (incluida la consola web de AWS) proporcionan alguna funcionalidad que imita un árbol de directorios, pero trabajará con S3 en lugar de trabajar con él si sus aplicaciones asumen que es equivalente a un sistema de archivos. Cambiar el nombre de lo que parece ser un directorio, por ejemplo, requiere escanear a través del espacio de teclas y modificar cada clave que contiene el 'nombre del directorio' en cuestión. Por otro lado, al ser una tienda de valores clave, no es necesario crear 'directorios principales' o limpiar 'carpetas vacías', lo que requeriría imitar un sistema de archivos
scooter-dangle

51

Suponga que quiere crear la carpeta abc / 123 / en su cubo, es muy fácil con Boto

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

O usa la consola


7
Esta es la respuesta correcta. Es posible con Boto y así es como lo haces. En realidad, new_key()es todo lo que necesitas. La cadena enviada a la función podría ser abc/123/o abc/123/newfile.txt. Lo que sea que prefieras. Me gusta envolver esto en una declaración if después de intentar obtener lo que espero que sea así: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Esencialmente, si no está allí, ¡créelo!
e.thompsy

1
Con la última API, bucket.key ('abc / 123 /') también logrará el mismo resultado.
luz 94

La especificación de una clave de directorio también funciona con la carga de archivos en cargas de mp = self._bucket.initiate_multipart_upload(bucket_key)
varias partes

20

Con AWS SDK .Net funciona perfectamente, simplemente agregue "/" al final de la cadena del nombre de la carpeta:

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

Luego actualice su consola de AWS y verá la carpeta


Intenté esto con la biblioteca ruby ​​AWS :: S3. Crea una "carpeta" con un archivo con un nombre de archivo en blanco ... Así que realmente no funciona. ¡Sin embargo, la solución de Mohammad Asgari funciona bien!
Nico

@Nico, pero ¿terminaste el nombre del archivo con una "/", tal como dice el comentario del código?
elranu

Sí, agregué la barra. Hice AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

Emitido "putObject" usando una cadena vacía y una barra al final funcionó para mí. Estoy usando PHP con la biblioteca tpyo / amazon-s3-php-class.
MikeMurko

2
@BoppityBop sí, tiene un botón de creación de carpeta, pero eso probablemente solo crea algún tipo de archivo vacío también
jamylak

15

Utilizar este:

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

Gracias por la ayuda, recibo el siguiente error. ¿Me pueden ayudar .botocore.exceptions.NoCredentialsError: No se pueden localizar las credenciales
Anvesh

1
Debe especificar sus credenciales de AWS de una forma u otra. Mira esto: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

¡Gracias! Esto funcionó muy bien para mí
:)


4

Es muy fácil crear carpetas. En realidad, es solo crear claves.

Puede ver mi siguiente código que estaba creando una carpeta con utc_time como nombre.

Recuerde que termina la clave con '/' como a continuación, esto indica que es una clave:

Clave = 'carpeta1 /' + 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

Actualización para 2019, si desea crear una carpeta con la ruta nombre_de_cubo / carpeta1 / carpeta2, puede usar este código:

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

Aunque puede crear una carpeta agregando "/" a su nombre_de_carpeta. Debajo del capó, S3 mantiene una estructura plana a diferencia de su NFS normal.

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

1

Probé muchos de los métodos anteriores y agregué una barra diagonal /al final del nombre de la clave, para crear el directorio no funcionó para mí:

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

Debe proporcionar el Bodyparámetro para crear el directorio:

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

Fuente: ryantuck en el número boto3


0

S3 no tiene una estructura de carpetas, pero hay algo llamado claves.

Podemos crear /2013/11/xyz.xlsy se mostrarán como carpetas en la consola. Pero la parte de almacenamiento de S3 lo tomará como nombre de archivo.

Incluso al recuperar observamos que podemos ver archivos en una carpeta particular (o claves) usando el ListObjectsmétodo y usando el Prefixparámetro.


0

Aparentemente ahora puede crear carpetas en S3. No estoy seguro desde cuándo, pero tengo un depósito en la zona "Estándar" y puedo elegir Crear carpeta en el menú desplegable Acción.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.