Amazon S3 boto - nasıl klasör oluşturulur?


123

botoAmazon s3 için kitaplığı kullanarak bir paket altında nasıl klasör oluşturabilirim ?

Kılavuzu takip ettim ve anahtarları izin, meta veri vb. İle oluşturdum, ancak boto'nun belgelerinde bir kova altında klasörlerin nasıl oluşturulacağını veya paketteki klasörler altında bir klasörün nasıl oluşturulacağını açıklamıyor.


görünüşe göre amazon s3 klasör kavramına sahip değil, bazıları dolaşmak için "klasör / test.txt" gibi bir anahtar oluşturmayı öneriyor. klasör oluşturmak için firefox s3 eklentisini kullanmayı denedim ve boto'daki tüm anahtarları listeledim, çıktılar az önce oluşturduğum klasör "<Anahtar: vitoshares, Everyone_ $ klasör $>], peki bu klasöre / klasörden içeriği nasıl görüntüleyebilirim / ekleyebilirim / değiştirebilirim?
vito huang

Not: "Klasörler" oluşturmak için AWS S3 yönetim arabirimi seçeneği S3FS ile uyumlu değildir, yani arabirimi kullanarak bir "klasör" oluşturun ve S3FS bağlama noktası aracılığıyla söz konusu klasörün bir listesini almaya çalışın.
jldupont

Not2: S3FS aracılığıyla bir "klasör" oluşturmak AWS S3 Management arabirimiyle uyumludur.
jldupont

Bunun Boto ile nasıl yapılacağına dair bir örnek için aşağıdaki @JaHax cevabına bakın. Kolay!
e.thompsy

Yanıtlar:


134

S3'te klasör veya dizin kavramı yoktur. "abc/xys/uvw/123.jpg"Birçok S3 erişim aracının S3Foxbir dizin yapısı gibi gösterdiği gibi dosya adları oluşturabilirsiniz , ancak bu aslında bir kova içindeki tek bir dosyadır.


1
Cevabınız için teşekkürler, bu yüzden sanırım belirli bir klasörün içeriğini görmek istersem, diğer birçok gereksiz dosyayı taramam gerekecek?
vito huang

7
çok iyi tanımlanmış klasörler kavramı vardır. cevap yanlış .. aşağıdaki elranu cevabına bakınız.
Boppity Bop

19
@BoppityBop: Orada klasörlerin hiçbir kavram içinde S3 . Yönetim konsolu ve birçok araç eğik çizgi içeren anahtarları temsil etse de, S3'ün klasörleri yoktur. Klasörlerle Çalışma bölümüne bakın ve şu bölümü okuyun: "Bu nedenle, konsol, klasörleri ve hiyerarşiyi sunmak için nesne anahtarı adlarını kullanır. Amazon S3'te yalnızca gruplarınız ve nesneleriniz var. "
Antti Haapala

7
Teknik olarak bir klasör olmayabilir, ancak kesinlikle klasör desteği var gibi görünüyor. Bir gruba bakarken aws konsolunda "Klasör Oluştur" u tıklayabilirsiniz ve bir tane oluşturacaktır ve boş olabilirler ve onlardan meta verileri çekebilirler.
phazei

4
S3, devasa, özel bir DynamoDB anahtar-değer deposudur. Bazı araçlar (AWS web konsolu dahil) bir dizin ağacını taklit eden bazı işlevler sağlar, ancak uygulamalarınız bir dosya sistemine eşdeğer olduğunu varsayıyorsa onunla çalışmak yerine S3'e karşı çalışacaksınız. Örneğin bir dizin gibi görünen şeyin yeniden adlandırılması, anahtar alanının taranmasını ve söz konusu 'dizin adını' içeren her anahtarın değiştirilmesini gerektirir. Öte yandan, bir anahtar-değer deposu olarak, bir dosya sistemini taklit etmenin gerektirdiği 'ana dizinler' oluşturmaya veya 'boş klasörleri' temizlemeye gerek yoktur
scooter-dangle

51

Kovanızda abc / 123 / klasörü oluşturmak istediğinizi varsayalım, Boto ile çocuk oyuncağı

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

Veya konsolu kullanın


7
Bu doğru cevap. Boto ile mümkün ve bu şekilde yapıyorsunuz. Aslında new_key()ihtiyacınız olan tek şey bu. İşleve gönderilen dize abc/123/veya olabilir abc/123/newfile.txt. Sen neyi tercih edersen. Orada olmasını umduğum şeyi şu şekilde elde etmeye çalıştıktan sonra bunu bir if cümlesine sarmayı seviyorum: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Esasen, eğer orada değilse, yaratın!
e.thompsy

1
En son api ile, buck.key ('abc / 123 /') da aynı sonucu elde edecektir.
light94

Bir dizin anahtarı belirtmek, çok parçalı yüklemelerde dosya yüklemeyle de çalışırmp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

AWS SDK ile .Net mükemmel çalışır, klasör adı dizesinin sonuna "/" eklemeniz yeterlidir:

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

Ardından AWS konsolunuzu yenileyin ve klasörü göreceksiniz


Bunu AWS :: S3 ruby ​​kitaplığıyla denedim. İçinde boş bir dosya adı olan bir dosya olan bir "klasör" oluşturur ... Yani gerçekten çalışmıyor. Mohammad Asgari'nin çözümü yine de iyi çalışıyor!
Nico

@Nico, ancak kod yorumunun dediği gibi dosya adını "/" ile mi bitirdiniz?
elranu

Evet, eğik çizgiyi ekledim. AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

Benim için çalıştı sonunda boş dize ve eğik çizgi kullanılarak "putObject" yayınlanmıştır. PHP'yi tpyo / amazon-s3-php-class kitaplığıyla kullanıyorum.
MikeMurko

2
@BoppityBop evet, bir klasör oluştur düğmesi var, ancak bu muhtemelen bir tür boş dosya da oluşturuyor
jamylak

15

Bunu kullan:

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

Yardım için teşekkürler, hata alıyorum. Lütfen bana yardım eder misiniz .botocore.exceptions.NoCredentialsError: Kimlik bilgileri bulunamıyor
Anvesh

1
Aws kimlik bilgilerinizi bir şekilde belirtmeniz gerekir. Şuna bir
Deepak GM

Teşekkürler! Bu benim için çok iyi çalıştı
:)


4

Klasör oluşturmak gerçekten çok kolay. Aslında sadece anahtarlar yaratmak.

Aşağıdaki kodumu görebilirsiniz, isim olarak utc_time ile bir klasör oluşturuyordum.

Unutmayın, aşağıdaki gibi anahtarı '/' ile bitirir , bu bunun bir anahtar olduğunu gösterir:

Anahtar = 'klasör1 /' + 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 güncellemesi, paket_adı / klasör1 / klasör2 yoluna sahip bir klasör oluşturmak istiyorsanız şu kodu kullanabilirsiniz:

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

Klasör_adınıza "/" ekleyerek bir klasör oluşturabilirsiniz. Kaputun altında S3, normal NFS'nizden farklı olarak düz yapıyı korur.

var params = {
            Kepçe: BucketName,
            Anahtar: klasörAdı + "/"
        };
s3.putObject (parametreler, işlev (hata, veri) {});

1

Yukarıda birçok yöntemi denedim ve /anahtar adının sonuna eğik çizgi ekleyerek , dizin oluşturmak benim için işe yaramadı:

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

BodyDizin oluşturmak için parametre sağlamanız gerekir :

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

Kaynak: boto3 sorununda ryantuck


0

S3'ün klasör yapısı yoktur, ancak anahtar denilen bir şey vardır.

/2013/11/xyz.xlsKonsolda klasörler oluşturabiliriz ve gösterilecektir. Ancak S3'ün depolama kısmı bunu dosya adı olarak alacaktır.

Geri alırken bile, ListObjectsyöntemi ve Prefixparametreyi kullanarak dosyaları belirli klasörlerde (veya anahtarlarda) görebildiğimizi gözlemliyoruz .


0

Görünüşe göre artık S3'te klasörler oluşturabilirsiniz. Ne zamandan beri emin değilim, ancak "Standart" bölgede bir paketim var ve İşlem açılır menüsünden Klasör Oluştur'u seçebilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.