2009-12-21 76 views
90

¿Cómo puedo crear una carpeta en un depósito utilizando la biblioteca boto para Amazon s3?Amazon S3 boto: ¿cómo crear una carpeta?

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

+0

parece Amazon S3 no tiene concepto de carpeta, algunos sugieren la creación de llave con nombre como "carpeta/test.txt' a conseguir alrededor de él He intentado utilizar Complemento de Firefox s3 para crear una carpeta, y una lista de todas las teclas en boto, muestra la carpeta que acabo de crear como "], entonces ¿cómo puedo ver/agregar/modificar contenido a/desde esta carpeta ? –

+0

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

+0

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

Respuesta

101

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 S3 como S3Fox muestran como una estructura de directorio, pero en realidad es solo un archivo en un segmento.

+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. –

+0

La API S3 le permite consultar un segmento para claves con un prefijo dado. Por lo tanto, debería poder construir una solicitud que solo devuelva objetos en su carpeta lógica. Ver: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/index.html?ListingKeysHierarchy.html –

+4

existe un concepto muy bien definido de carpetas. la respuesta es incorrecta. ver respuesta de elranu a continuación. –

17

Con AWS SDK .Net funciona perfectamente, sólo tiene que añadir "/" al final de la cadena de nombre de carpeta:

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

refrescar la consola de AWS, y verá la carpeta

+0

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

+0

@Nico, pero ¿finalizó el nombre de archivo con un "/", tal como dice el comentario del código? – elranu

+0

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

1

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

Podemos crear /2013/11/xyz.xls y se mostrará como una carpeta en la consola. Pero la parte de almacenamiento de S3 tomará eso como el nombre del archivo.

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

33

Supongamos que quieres crear la carpeta abc/123/en su cubo, que es un pedazo de pastel con Boto

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

o utilizar el console

+3

Esta es la respuesta correcta. Es posible con Boto y así es como lo haces. En realidad, 'new_key()' es todo lo que necesita. 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 esté allí así: 'key = bucket.get_key (upgrade_path) if key is None: key = bucket.new_key (upgrade_path)' En esencia, si no está allí, ¡créelo! –

+0

Con la última API, bucket.key ('abc/123 /') también obtendrá el mismo resultado. – light94

+0

La especificación de una clave de directorio también funciona con la carga de archivos en ** cargas múltiples ** ** 'mp = self._bucket.initiate_multipart_upload (bucket_key) '' ' –

0

Al parecer, 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.

1

Crear carpetas es realmente fácil. En realidad, solo está creando claves.

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

me acuerdo termina la llave con '/' como el de abajo, esto indica que es una clave:

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

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, 
      Key : folderName + "/" 
     }; 
s3.putObject(params, function (err, data) {}); 
0

Utilice esta:.

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

Gracias por la ayuda, estoy obteniendo el error debajo. ¿me puede ayudar por favor .Botocore.exceptions.NoCredentialsError: no se pueden encontrar las credenciales – Anvesh

+0

¿puede compartir su código? –

Cuestiones relacionadas