Amazon S3 boto - jak stworzyć folder?

123

Jak mogę utworzyć folder w zasobniku za pomocą botobiblioteki dla Amazon s3?

Postępowałem zgodnie z instrukcją i utworzyłem klucze z uprawnieniami, metadanymi itp., Ale nigdzie w dokumentacji boto nie opisano, jak tworzyć foldery pod wiadrem lub tworzyć folder pod folderami w wiadrze.

vito huang
źródło
wygląda na to, że amazon s3 nie ma koncepcji folderu, niektórzy sugerują utworzenie klucza o nazwie takiej jak „folder / test.txt”, aby go obejść. Próbowałem użyć wtyczki firefox s3 do utworzenia folderu i wyświetlić wszystkie klucze w boto, wyświetla folder, który właśnie utworzyłem jako „<Key: vitoshares, every_ $ folder $>], więc jak mogę przeglądać / dodawać / modyfikować zawartość do / z tego folderu?
vito huang
Uwaga: opcja interfejsu zarządzania AWS S3 do tworzenia „folderów” nie jest kompatybilna z S3FS, tj. Utwórz „folder” za pomocą interfejsu i spróbuj uzyskać listę wspomnianego folderu przez punkt montowania S3FS.
jldupont,
Uwaga 2: tworzenie „folderu” przez S3FS jest jednak zgodne z interfejsem zarządzania AWS S3.
jldupont,
Zobacz odpowiedź @JaHax poniżej, aby zobaczyć przykład, jak to zrobić z Boto. Łatwo!
e.thompsy

Odpowiedzi:

134

W S3 nie ma koncepcji folderów ani katalogów. Możesz tworzyć nazwy plików, takie jak "abc/xys/uvw/123.jpg"wiele narzędzi dostępu S3, takich S3Foxjak struktura katalogów, ale w rzeczywistości jest to tylko jeden plik w wiadrze.

user240469
źródło
1
dziękuję za odpowiedź, więc myślę, że jeśli chcę zobaczyć zawartość konkretnego folderu, będę musiał przejść wiele innych niepotrzebnych plików?
vito huang
7
istnieje bardzo dobrze zdefiniowana koncepcja folderów. odpowiedź jest nieprawidłowa .. zobacz odpowiedź elranu poniżej.
Boppity Bop
19
@BoppityBop: Nie ma pojęcia folderów w S3 . S3 nie ma folderów, mimo że konsola zarządzania i wiele narzędzi reprezentuje klucze z ukośnikami jako takimi. Zobacz Praca z folderami i przeczytaj część: „Tak więc konsola używa nazw kluczy obiektów do prezentowania folderów i hierarchii. W Amazon S3 masz tylko zasobniki i obiekty.
Antti Haapala
7
Z technicznego punktu widzenia może to nie być folder, ale na pewno istnieje obsługa folderów. W konsoli aws, patrząc na wiadro, możesz kliknąć „Utwórz folder”, a utworzy on jeden, który może być pusty i pobrać z nich metadane.
phazei
4
S3 to gigantyczny, niestandardowy magazyn kluczy i wartości DynamoDB. Niektóre narzędzia (w tym konsola internetowa AWS) zapewniają pewną funkcjonalność, która naśladuje drzewo katalogów, ale będziesz pracować z S3 zamiast pracować z nim, jeśli twoje aplikacje przyjmą, że jest to odpowiednik systemu plików. Na przykład zmiana nazwy elementu, który wydaje się być katalogiem, wymaga przeszukania przestrzeni kluczy i zmodyfikowania każdego klucza zawierającego daną „nazwę katalogu”. Z drugiej strony, będąc magazynem kluczy i wartości, nie ma potrzeby tworzenia „katalogów nadrzędnych” ani czyszczenia „pustych folderów”, co wymagałoby naśladowania systemu plików
scooter-dangle
51

Załóżmy, że chcesz utworzyć folder abc / 123 / w swoim wiadrze, to bułka z masłem z Boto

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

Lub użyj konsoli

TomNg
źródło
7
To jest poprawna odpowiedź. Z Boto jest to możliwe i tak to się robi. Właściwie new_key()to wszystko, czego potrzebujesz. Ciąg wysłany do funkcji może mieć postać abc/123/lub abc/123/newfile.txt. Cokolwiek wolisz. Chciałbym zawrzeć to w oświadczeniu if po tym, jak próbuję uzyskać to, co mam nadzieję, w ten sposób: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Zasadniczo, jeśli go nie ma, utwórz je!
e.thompsy
1
Z najnowszym interfejsem API ten sam wynik osiągnie również bucket.key („abc / 123 /”).
light94
Określenie klucza katalogu działa również w przypadku przesyłania plików w przypadku przesyłania wielu części mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138
20

Z AWS SDK .Net działa doskonale, wystarczy dodać „/” na końcu ciągu nazwy folderu:

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

Następnie odśwież konsolę AWS, a zobaczysz folder

elranu
źródło
Właśnie wypróbowałem to z biblioteką ruby ​​AWS :: S3. Tworzy „folder” z plikiem z pustą nazwą pliku… Więc to tak naprawdę nie działa. Rozwiązanie Mohammada Asgari działa jednak dobrze!
Nico,
@Nico, ale czy nazwa pliku została zakończona znakiem „/”, tak jak mówi komentarz do kodu?
elranu
Tak, dodałem ukośnik. Zrobiłem AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico
Wydany "putObject" przy użyciu pustego napisu i ukośnika na końcu zadziałał. Używam PHP z biblioteką klasy tpyo / amazon-s3-php.
MikeMurko
2
@BoppityBop tak, ma przycisk tworzenia folderu, ale to prawdopodobnie tworzy również jakiś pusty plik
jamylak
15

Użyj tego:

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
źródło
Dzięki za pomoc otrzymuję poniżej błąd. czy możesz mi pomóc .botocore.exceptions.NoCredentialsError: Unable to locate credentials
Anvesh,
1
Musisz w jakiś sposób określić swoje poświadczenia aws. Sprawdź to: boto3.readthedocs.io/en/latest/guide/ ...
Deepak GM,
Dzięki! U mnie to zadziałało bardzo dobrze
:)
4

Tworzenie folderów jest naprawdę łatwe. Właściwie to tylko tworzenie kluczy.

Możesz zobaczyć mój poniższy kod, który tworzyłem folder z utc_time jako nazwą.

Pamiętaj, że klucz kończy się znakiem „/” znakiem jak poniżej, co oznacza, że ​​jest to klucz:

Klucz = '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
Gabriel Wu
źródło
4

Aktualizacja na rok 2019, jeśli chcesz utworzyć folder ze ścieżką nazwa_katalogu / folder1 / folder2, możesz użyć tego kodu:

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
źródło
1

Chociaż możesz utworzyć folder, dołączając „/” do swojej nazwa_folderu. Pod maską S3 zachowuje płaską strukturę w przeciwieństwie do zwykłego NFS.

var params = {
            Wiadro: nazwa wiadra,
            Klucz: nazwa folderu + „/”
        };
s3.putObject (params, function (err, data) {});
vpage
źródło
1

Wypróbowałem wiele metod powyżej i dodanie ukośnika /na końcu nazwy klucza, aby utworzyć katalog, nie działało dla mnie:

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

BodyAby stworzyć katalog, musisz podać parametr:

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

Źródło: ryantuck w numerze boto3

azzamsa
źródło
0

S3 nie ma struktury folderów, ale istnieje coś, co nazywa się kluczami.

Możemy tworzyć /2013/11/xyz.xlsi będą wyświetlane jako foldery w konsoli. Ale część pamięci S3 przyjmie to jako nazwę pliku.

Nawet podczas pobierania obserwujemy, że możemy zobaczyć pliki w określonym folderze (lub kluczach) za pomocą ListObjectsmetody i Prefixparametru.

Balaram
źródło
0

Najwyraźniej możesz teraz tworzyć foldery w S3. Nie jestem pewien od kiedy, ale mam zasobnik w strefie „Standard” i mogę wybrać opcję Utwórz folder z menu rozwijanego Akcja.

Perelx
źródło