Amazon S3 boto - как создать папку?


123

Как создать папку под ведром с помощью botoбиблиотеки для Amazon s3?

Я следовал руководству и создал ключи с разрешениями, метаданными и т. Д., Но нигде в документации boto не описывается, как создавать папки в ведре или создавать папку в папках в ведре.


Кажется, что у amazon s3 нет концепции папки, некоторые предлагают создать ключ с именем типа "folder / test.txt", чтобы обойти его. Я попытался использовать плагин firefox s3 для создания папки и перечислить все ключи в boto, он выводит папка, которую я только что создал, как «<Key: vitoshares, every_ $ folder $>], так как я могу просматривать / добавлять / изменять содержимое этой папки / из этой папки?
Вито Хуан

Примечание. Параметр интерфейса управления AWS S3 для создания «папок» несовместим с S3FS, т.е. создайте «папку» с помощью интерфейса и попытайтесь получить список указанной папки через точку монтирования S3FS.
jldupont

Примечание 2: создание «папки» через S3FS совместимо с интерфейсом управления AWS S3.
jldupont

См. Ответ @JaHax ниже, чтобы узнать, как это сделать с помощью Boto. Легко!
e.thompsy

Ответы:


134

В S3 нет концепции папок или каталогов. Вы можете создавать имена файлов, например "abc/xys/uvw/123.jpg", которые многие инструменты доступа S3, например, S3Foxотображают как структуру каталогов, но на самом деле это всего лишь один файл в корзине.


1
спасибо за ответ, поэтому я думаю, если я хочу увидеть содержимое определенной папки, мне нужно будет просмотреть множество других ненужных файлов?
Вито Хуанг

7
существует очень четко определенная концепция папок. ответ неверный .. см. ответ elranu ниже.
Boppity Bop

19
@BoppityBop: Там не существует понятия папки в S3 . S3 не имеет папок, хотя консоль управления и многие инструменты представляют ключи с косой чертой как таковые. См. Раздел Работа с папками и прочтите часть: «Итак, консоль использует имена ключей объектов для представления папок и иерархии. В Amazon S3 у вас есть только корзины и объекты »,
Антти Хаапала,

7
Технически это может быть не папка, но определенно есть поддержка папок. В консоли aws, глядя на корзину, вы можете щелкнуть «Создать папку», и она создаст одну, и они могут быть пустыми, и извлечь из них метаданные.
phazei

4
S3 - это гигантское настраиваемое хранилище ключей и значений DynamoDB. Некоторые инструменты (включая веб-консоль AWS) предоставляют некоторые функции, имитирующие дерево каталогов, но вы будете работать с S3, а не работать с ним, если ваши приложения предполагают, что он эквивалентен файловой системе. Например, переименование того, что выглядит как каталог, требует сканирования всего пространства ключей и изменения каждого ключа, содержащего рассматриваемое «имя каталога». С другой стороны, будучи хранилищем «ключ-значение», нет необходимости в создании «родительских каталогов» или очистке «пустых папок», которые потребуются для имитации файловой системы
scooter-dangle

51

Предположим, вы хотите создать папку abc / 123 / в своем ведре, с Boto это проще простого.

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

Или используйте консоль


7
Это правильный ответ. Это возможно с помощью Boto, и вот как вы это делаете. Собственно new_key()это все, что вам нужно. Строка, отправляемая в функцию, может быть abc/123/или abc/123/newfile.txt. Что вы предпочитаете. Мне нравится заключать это в оператор if после того, как я попытаюсь получить то, что, я надеюсь, есть, вот так: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)По сути, если его нет, создайте его!
e.thompsy

1
С последним API bucket.key ('abc / 123 /') также достигнет того же результата.
light94

Указание ключа каталогов также работает с загрузки файлов в загрузки многочастных mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

С AWS SDK .Net отлично работает, просто добавьте «/» в конец строки имени папки:

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

Затем обновите консоль AWS, и вы увидите папку


Просто попробовал это с рубиновой библиотекой AWS :: S3. Он создает "папку" с файлом с пустым именем в ней ... Так что на самом деле это не работает. Решение Мохаммада Асгари работает нормально!
Нико

@Nico, но вы закончили имя файла знаком "/", как сказано в комментарии к коду?
elranu

Да, косую черту добавил. Я сделал AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Нико

Выпущенный "putObject" с использованием пустой строки и косой черты в конце у меня сработал. Я использую PHP с библиотекой tpyo / amazon-s3-php-class.
MikeMurko

2
@BoppityBop да, у него есть кнопка создания папки, но это, вероятно, просто создает какой-то пустой файл
jamylak

15

Использовать это:

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

Спасибо за помощь, я получаю ошибку ниже. Не могли бы вы помочь мне .botocore.exceptions.NoCredentialsError: невозможно найти учетные данные
Анвеш

1
Вам нужно так или иначе указать свои учетные данные aws. Проверьте это: boto3.readthedocs.io/en/latest/guide/…
GM Deepak

Спасибо! У меня это сработало очень хорошо
:)

7

Добавьте "_ $ folder $" к имени вашей папки и вызовите put.

    String extension = "_$folder$";
    s3.putObject("MyBucket", "MyFolder"+ extension, new ByteArrayInputStream(new byte[0]), null);

см. http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/


Такой способ создания папки больше не работает. Вам следует попробовать способ, предложенный @TomNg
radalin

4

Создавать папки действительно легко. На самом деле это просто создание ключей.

Вы можете увидеть мой код ниже, я создавал папку с именем utc_time.

Помните, что конец ключа заканчивается на '/', как показано ниже, это означает, что это ключ:

Ключ = 'folder1 /' + 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

Обновление на 2019 год, если вы хотите создать папку с путем bucket_name / folder1 / folder2, вы можете использовать этот код:

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

Хотя вы можете создать папку, добавив "/" к вашему имени папки. Под капотом S3 сохраняет плоскую структуру в отличие от вашего обычного NFS.

var params = {
            Bucket: bucketName,
            Ключ: имя папки + "/"
        };
s3.putObject (параметры, функция (ошибка, данные) {});

1

Пробовал многие методы выше и добавление косой черты /в конец имени ключа, чтобы создать каталог, у меня не сработало:

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

Вы должны указать Bodyпараметр для создания каталога:

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

Источник: ryantuck в выпуске boto3


0

S3 не имеет структуры папок, но есть что-то, что называется ключами.

Мы можем создать, /2013/11/xyz.xlsи это будет отображаться как папка в консоли. Но хранилище S3 примет это как имя файла.

Даже при извлечении мы замечаем, что можем видеть файлы в определенной папке (или ключах), используя ListObjectsметод и Prefixпараметр.


0

Судя по всему, теперь вы можете создавать папки в S3. Не знаю, с каких пор, но у меня есть корзина в зоне «Стандартная», и я могу выбрать «Создать папку» в раскрывающемся списке «Действие».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.