Бото Amazon S3 - як створити папку?


123

Як я можу створити папку під відром, використовуючи botoбібліотеку для Amazon s3?

Я дотримувався посібника і створював ключі з дозволом, метаданими тощо, але там, де в документації boto не описано, як створити папки під відром або створити папку під папками у відрі.


здається, Amazon s3 не має поняття папки, деякі пропонують створити ключ із назвою типу "папка / test.txt", щоб обійти його. Я спробував використовувати плагін Firefox s3 для створення папки та перерахував усі клавіші в boto, він виводить папку, яку я щойно створив як "<Ключ: vitoshares, every_ $ folder $>], тож як я можу переглянути / додати / змінити вміст у / з цієї папки?
vito huang

Примітка. Параметр інтерфейсу управління AWS S3 для створення "папок" не сумісний з S3FS, тобто створити "папку" за допомогою інтерфейсу та спробувати отримати список зазначеної папки через точку монтажу S3FS.
jldupont

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

Дивіться відповідь @JaHax нижче для прикладу того, як це зробити з Boto. Легко!
ептомпсія

Відповіді:


134

У S3 відсутнє поняття папок чи каталогів. Ви можете створити такі імена файлів, як "abc/xys/uvw/123.jpg"багато інструментів доступу до S3, S3Foxподібні до структури каталогів, але насправді це лише один файл у відрі.


1
дякую за відповідь, тому я здогадуюсь, що якщо я хочу переглянути вміст певної папки, мені потрібно буде пройти багато інших непотрібних файлів?
vito huang

7
існує дуже чітко визначена концепція папок. відповідь неправильна .. див. відповідь elranu нижче.
Boppity Bop

19
@BoppityBop: Там не існує поняття папки в S3 . У S3 немає папок, навіть незважаючи на те, що консоль управління та багато інструментів представляють ключі з косою рисою як такою. Див. Розділ Робота з папками та прочитайте частину: "Отже, консоль використовує імена ключових об'єктів для представлення папок та ієрархії. В Amazon S3 у вас є лише відра та об'єкти ".
Анті Хаапала

7
Технічно це не може бути папка, але, безумовно, існує підтримка папок. На консолі aws, дивлячись на відро, ви можете натиснути «Створити папку», і воно зробить одне, і вони можуть бути порожніми, і витягнути з них метадані.
фазей

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)По суті, якщо його немає, створіть його!
напр.

1
З останньою версією api, bucket.key ('abc / 123 /') також досягне того ж результату.
light94

Вказівка ​​ключа каталогу також працює з завантаженням файлів у завантаженнях з mp = self._bucket.initiate_multipart_upload(bucket_key)
кількома частинами

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.
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: Не вдається знайти облікові дані
Anvesh

1
Вам потрібно певним чином вказати свої повноваження. Перевірте це: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

Дякую! Це дуже добре спрацювало для мене
:)

7

Додайте "_ $ папку $" до назви вашої папки та виклику.

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

див .: http://www.snowgiraffe.com/tech/147/creating-folders-programmatic-with-amazon-s3s-api-putting-babies-in-buckets/


Цей спосіб створення папки вже не працює. Спробуйте скористатися способом, запропонованим @TomNg
radalin

4

Створювати папки дуже просто. Насправді це просто створення ключів.

Ви можете бачити мій нижче код, я створював папку з utc_time як ім'я.

Пам'ятайте, як закінчується ключ на "/", як показано нижче, це означає, що це ключ:

Key = 'папка1 /' + 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 = {
            Відро: bucketName,
            Ключ: папкаName + "/"
        };
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.