Amazon S3 boto - wie erstelle ich einen Ordner?


123

Wie kann ich mit einen Ordner unter einem Bucket erstellen? boto Bibliothek für Amazon S3 ?

Ich habe das Handbuch befolgt und die Schlüssel mit Berechtigung, Metadaten usw. erstellt, aber nirgends in der Dokumentation des Botos wird beschrieben, wie Ordner unter einem Bucket oder ein Ordner unter Ordnern im Bucket erstellt werden.


Es scheint, dass Amazon S3 kein Ordnerkonzept hat. Einige schlagen vor, einen Schlüssel mit einem Namen wie "folder / test.txt" zu erstellen, um ihn zu umgehen. Ich habe versucht, das Firefox S3-Plugin zu verwenden, um einen Ordner zu erstellen und alle Schlüssel in Boto aufzulisten Der Ordner, den ich gerade als "<Key: vitoshares, every_ $ folder $>] erstellt habe. Wie kann ich also Inhalte zu / von diesem Ordner anzeigen / hinzufügen / ändern?
Vito Huang

Hinweis: Die Option der AWS S3-Verwaltungsschnittstelle zum Erstellen von "Ordnern" ist nicht mit S3FS kompatibel. Erstellen Sie daher über die Schnittstelle einen "Ordner" und versuchen Sie, eine Liste dieses Ordners über den S3FS-Einhängepunkt abzurufen.
Jldupont

Hinweis 2: Das Erstellen eines "Ordners" über S3FS ist jedoch mit der AWS S3-Verwaltungsoberfläche kompatibel.
Jldupont

In der Antwort von @JaHax unten finden Sie ein Beispiel dafür, wie dies mit Boto gemacht wird. Einfach!
e.thompsy

Antworten:


133

In S3 gibt es kein Konzept für Ordner oder Verzeichnisse. Sie können Dateinamen wie erstellen "abc/xys/uvw/123.jpg", die viele S3-Zugriffstools S3Foxwie eine Verzeichnisstruktur anzeigen, aber es ist eigentlich nur eine einzelne Datei in einem Bucket.


1
Vielen Dank für die Antwort. Wenn ich also den Inhalt eines bestimmten Ordners sehen möchte, muss ich viele andere unnötige Dateien durchsuchen.
Vito Huang

7
Es gibt ein sehr gut definiertes Konzept für Ordner. die antwort ist falsch .. siehe elranu antwort unten.
Boppity Bop

19
@BoppityBop: In S3 gibt es kein Konzept für Ordner . S3 verfügt nicht über Ordner, obwohl die Verwaltungskonsole und viele Tools Schlüssel mit Schrägstrichen als solche darstellen. Siehe Arbeiten mit Ordnern und lesen Sie den Teil: "Die Konsole verwendet also Objektschlüsselnamen, um Ordner und Hierarchien darzustellen. In Amazon S3 haben Sie nur Buckets und Objekte. "
Antti Haapala

7
Technisch gesehen ist es vielleicht kein Ordner, aber es scheint definitiv Ordnerunterstützung zu geben. Wenn Sie in der aws-Konsole einen Bucket betrachten, können Sie auf "Ordner erstellen" klicken. Daraufhin wird ein Ordner erstellt. Diese können leer sein und Metadaten daraus abrufen.
Phazei

4
S3 ist ein riesiger, benutzerdefinierter DynamoDB-Schlüsselwertspeicher. Einige Tools (einschließlich der AWS-Webkonsole) bieten einige Funktionen, die einen Verzeichnisbaum imitieren. Sie arbeiten jedoch eher mit S3 als mit S3, wenn Ihre Anwendungen davon ausgehen, dass es einem Dateisystem entspricht. Um beispielsweise ein Verzeichnis umzubenennen, müssen Sie den Schlüsselbereich durchsuchen und jeden Schlüssel ändern, der den betreffenden 'Verzeichnisnamen' enthält. Auf der anderen Seite ist es als Schlüsselwertspeicher nicht erforderlich, "übergeordnete Verzeichnisse" zu erstellen oder "leere Ordner" zu bereinigen, was die Nachahmung eines Dateisystems erfordern würde
scooter-dangle

51

Angenommen, Sie möchten einen Ordner abc / 123 / in Ihrem Eimer erstellen, das ist mit Boto ein Kinderspiel

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

Oder benutzen Sie die Konsole


7
Dies ist die richtige Antwort. Mit Boto ist das möglich und so machen Sie es. Eigentlich new_key()ist das alles was du brauchst. Die an die Funktion gesendete Zeichenfolge kann abc/123/oder sein abc/123/newfile.txt. Was auch immer Sie bevorzugen. Ich mag es, dies in eine if-Anweisung zu packen, nachdem ich versucht habe, das zu bekommen, was ich hoffe key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path), dass es so ist : Wenn es nicht da ist, erstelle es im Wesentlichen!
e.thompsy

1
Mit der neuesten API erzielt Bucket.key ('abc / 123 /') ebenfalls das gleiche Ergebnis.
light94

Die Angabe eines Verzeichnisschlüssels funktioniert auch beim Hochladen von Dateien in mehrteiligen Uploads mp = self._bucket.initiate_multipart_upload(bucket_key)
Storm_M2138

20

Mit AWS SDK .Net funktioniert einwandfrei. Fügen Sie einfach "/" am Ende der Ordnernamenzeichenfolge hinzu:

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

Aktualisieren Sie dann Ihre AWS-Konsole, und Sie sehen den Ordner


Ich habe es gerade mit der Ruby-Bibliothek AWS :: S3 versucht. Es wird ein "Ordner" mit einer Datei mit einem leeren Dateinamen erstellt ... Es funktioniert also nicht wirklich. Die Lösung von Mohammad Asgari funktioniert jedoch einwandfrei!
Nico

@Nico aber hast du den Dateinamen mit einem "/" beendet, genau wie der Codekommentar sagt?
Elranu

Ja, ich habe den Schrägstrich hinzugefügt. Ich habe AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

Das Problem "putObject" mit leerem String und Schrägstrich am Ende hat bei mir funktioniert. Ich verwende PHP mit der Bibliothek der tpyo / amazon-s3-php-Klasse.
Mike Murko

2
@ BoppityBop Ja, es hat eine Schaltfläche zum Erstellen eines Ordners, aber das macht wahrscheinlich auch eine Art leere Datei
Jamylak

15

Benutze das:

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

Vielen Dank für die Hilfe, ich erhalte unten Fehler. Können Sie mir bitte helfen? .botocore.exceptions.NoCredentialsError: Anmeldeinformationen können nicht gefunden werden
Anvesh

1
Sie müssen Ihre aws-Anmeldeinformationen auf die eine oder andere Weise angeben. Überprüfen Sie dies heraus: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

Vielen Dank! Das hat bei mir sehr gut
funktioniert :)


4

Es ist wirklich einfach, Ordner zu erstellen. Eigentlich geht es nur darum, Schlüssel zu erstellen.

Sie können meinen folgenden Code sehen, ich habe einen Ordner mit utc_time als Namen erstellt.

Denken Sie daran, beendet den Schlüssel mit '/' wie unten Dies zeigt an, dass es sich um einen Schlüssel handelt:

Key = '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

Update für 2019: Wenn Sie einen Ordner mit dem Pfad Bucket_Name / Ordner1 / Ordner2 erstellen möchten, können Sie diesen Code verwenden:

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

Sie können zwar einen Ordner erstellen, indem Sie "/" an Ihren Ordnernamen anhängen. Unter der Haube behält S3 im Gegensatz zu Ihrem normalen NFS eine flache Struktur bei.

var params = {
            Bucket: BucketName,
            Schlüssel: Ordnername + "/"
        };
s3.putObject (params, function (err, data) {});

1

Viele der oben beschriebenen Methoden und das Hinzufügen eines Schrägstrichs /am Ende des Schlüsselnamens zum Erstellen eines Verzeichnisses haben bei mir nicht funktioniert:

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

Sie müssen BodyParameter angeben, um ein Verzeichnis zu erstellen:

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

Quelle: Ryantuck in der Ausgabe von Boto3


0

S3 hat keine Ordnerstruktur, aber es gibt so etwas wie Schlüssel.

Wir können erstellen /2013/11/xyz.xlsund werden als Ordner in der Konsole angezeigt. Der Speicherteil von S3 verwendet dies jedoch als Dateinamen.

Selbst beim Abrufen stellen wir fest, dass wir Dateien in bestimmten Ordnern (oder Schlüsseln) mithilfe der ListObjectsMethode und des PrefixParameters sehen können.


0

Anscheinend können Sie jetzt Ordner in S3 erstellen. Ich bin mir seit wann nicht sicher, aber ich habe einen Bucket in der Zone "Standard" und kann Ordner aus der Dropdown-Liste Aktion auswählen auswählen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.