Amazon S3 boto - como criar uma pasta?

123

Como posso criar uma pasta em um balde usando boto biblioteca do Amazon s3?

Segui o manual e criei as chaves com permissão, metadados, etc., mas em nenhum lugar da documentação do boto ele descreve como criar pastas em um bucket ou criar uma pasta em pastas no bucket.

vito huang
fonte
parece que o amazon s3 não tem conceito de pasta, alguns sugerem a criação de uma chave com nome como "folder / test.txt 'para contorná-la. tentei usar o plugin firefox s3 para criar uma pasta e listar todas as chaves no boto, ele gera a pasta que acabei de criar como "<Key: vitoshares, everyone_ $ folder $>], então como posso visualizar / adicionar / modificar o conteúdo de / para essa pasta?
vito huang
Nota: a opção da interface de gerenciamento do AWS S3 para criar "pastas" não é compatível com o S3FS, ou seja, crie uma "pasta" usando a interface e tente obter uma lista dessa pasta pelo ponto de montagem do S3FS.
Jdupont
Nota 2: a criação de uma "pasta" por meio do S3FS é compatível com a interface do AWS S3 Management.
Jdupont
Consulte a resposta @JaHax abaixo para obter um exemplo de como fazer isso com o Boto. Fácil!
thompsy

Respostas:

134

Não há conceito de pastas ou diretórios no S3. Você pode criar nomes de arquivo como "abc/xys/uvw/123.jpg", que muitas ferramentas de acesso ao S3 S3Foxmostram como uma estrutura de diretório, mas na verdade é apenas um único arquivo em um bucket.

user240469
fonte
1
obrigado pela resposta, então eu acho que se eu quiser ver o conteúdo de uma pasta específica, vou precisar percorrer muitos outros arquivos desnecessários?
precisa saber é o seguinte
7
existe um conceito muito bem definido de pastas. a resposta está incorreta. veja a resposta elranu abaixo.
Boppity Bop
19
@BoppityBop: Não há conceito de pastas no S3 . O S3 não possui pastas, mesmo que o console de gerenciamento e muitas ferramentas representem chaves com barras como tal. Consulte Trabalhando com pastas e leia a parte: "Portanto, o console usa nomes de chaves de objetos para apresentar pastas e hierarquia. No Amazon S3, você tem apenas buckets e objetos. "
Antti Haapala
7
Tecnicamente, pode não ser uma pasta, mas definitivamente parece haver suporte a pastas. No console do aws, ao olhar para um balde, você pode clicar em "Criar pasta" e ele criará um, e eles poderão estar vazios e extrair metadados deles.
Phazei
4
O S3 é um gigantesco armazenamento de valores-chave personalizado do DynamoDB. Algumas ferramentas (incluindo o console da web da AWS) fornecem algumas funcionalidades que imitam uma árvore de diretórios, mas você estará trabalhando no S3 em vez de trabalhar com ele se seus aplicativos assumirem que é equivalente a um sistema de arquivos. Renomear o que parece ser um diretório, por exemplo, requer a varredura no espaço de chaves e a modificação de todas as chaves que contêm o 'nome do diretório' em questão. Por outro lado, sendo um armazenamento de chave-valor, não há necessidade de criar 'diretórios pai' ou limpar 'pastas vazias', que imita um sistema de arquivos exigiria
scooter dangle
51

Suponha que você queira criar a pasta abc / 123 / no seu balde, é um pedaço de bolo com o Boto

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

Ou use o console

TomNg
fonte
7
Essa é a resposta correta. É possível com o Boto e é assim que você faz. Na verdade, new_key()é tudo o que você precisa. A sequência enviada para a função pode ser abc/123/ou abc/123/newfile.txt. O que você preferir. Eu gosto de colocar isso em uma declaração if depois de tentar obter o que espero que exista assim: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Essencialmente, se não estiver lá, crie-o!
precisa saber é o seguinte
1
Com a API mais recente, bucket.key ('abc / 123 /') também alcançará o mesmo resultado.
light94
Especificando uma chave diretório também funciona com arquivos de upload em envios de várias partes mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138
20

Com o AWS SDK .Net funciona perfeitamente, basta adicionar "/" no final da string do nome da pasta:

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

Atualize seu console da AWS e você verá a pasta

elranu
fonte
Tentei isso com a biblioteca ruby ​​AWS :: S3. Ele cria uma "pasta" com um arquivo com um nome de arquivo em branco nele ... Portanto, realmente não funciona. A solução de Mohammad Asgari funciona bem!
Nico
@ Nico, mas você terminou o nome do arquivo com um "/", como diz o comentário do código?
26512 elranu
Sim, eu adicionei a barra. Eu fiz AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico
Emitido "putObject" usando string vazia e barra no final funcionou para mim. Estou usando o PHP com a biblioteca tpyo / amazon-s3-php-class.
precisa saber é o seguinte
2
@BoppityBop sim ele tem um criar a pasta botão, mas que provavelmente só faz algum tipo de arquivo vazio bem
jamylak
15

Usa isto:

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+'/'))
Reza Amya
fonte
Obrigado pela ajuda, estou recebendo erro abaixo. você pode por favor me ajudar .botocore.exceptions.NoCredentialsError: Não foi possível localizar credenciais
Anvesh
1
Você precisa especificar suas credenciais do aws de uma forma ou de outra. Verifique isto: boto3.readthedocs.io/en/latest/guide/…
Deepak GM
Obrigado! Isso funcionou muito bem para mim
:)
4

É realmente fácil criar pastas. Na verdade, é apenas a criação de chaves.

Você pode ver meu código abaixo: eu estava criando uma pasta com utc_time como nome.

Lembre-se de terminar a chave com '/' como abaixo, isso indica que é uma chave:

Chave = 'pasta1 /' + 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
Gabriel Wu
fonte
4

Atualização para 2019, se você deseja criar uma pasta com o caminho bucket_name / folder1 / folder2, você pode 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)
Ilya Vinnichenko
fonte
1

Embora você possa criar uma pasta anexando "/" ao nome da sua pasta. Sob o capô, o S3 mantém a estrutura plana, diferentemente do NFS comum.

var params = {
            Bucket: bucketName,
            Chave: folderName + "/"
        };
s3.putObject (parâmetros, função (err, dados) {});
vpage
fonte
1

Tentei muitos métodos acima e adicionar barra /ao final do nome da chave, para criar o diretório, não funcionou para mim:

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

Você precisa fornecer o Bodyparâmetro para criar o diretório:

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

Fonte: ryantuck na edição boto3

azzamsa
fonte
0

O S3 não possui uma estrutura de pastas, mas existe algo chamado como chaves.

Nós podemos criar /2013/11/xyz.xlse ser mostrados como pastas no console. Mas a parte de armazenamento do S3 tomará isso como o nome do arquivo.

Mesmo ao recuperar, observamos que podemos ver arquivos em determinada pasta (ou chaves) usando o ListObjectsmétodo e usando o Prefixparâmetro

Balaram
fonte
0

Aparentemente, agora você pode criar pastas no S3. Não tenho certeza desde quando, mas tenho um bucket na zona "Padrão" e posso escolher Criar pasta na lista suspensa Ação.

Perelx
fonte