Amazon S3 boto - bagaimana cara membuat folder?

123

Bagaimana cara membuat folder di bawah ember menggunakan botoperpustakaan untuk Amazon s3?

Saya mengikuti manual, dan membuat kunci dengan izin, metadata dll, tetapi tidak ada di mana dalam dokumentasi boto itu menjelaskan cara membuat folder di bawah ember, atau membuat folder di bawah folder di ember.

vito huang
sumber
tampaknya amazon s3 tidak memiliki konsep folder, beberapa menyarankan untuk membuat kunci dengan nama seperti "folder / test.txt 'untuk menyiasatinya. saya mencoba menggunakan plugin firefox s3 untuk membuat folder, dan mencantumkan semua kunci di boto, itu menghasilkan folder yang baru saya buat sebagai "<Key: vitoshares, everyone_ $ folder $>], jadi bagaimana saya dapat melihat / menambah / memodifikasi konten ke / dari folder ini?
vito huang
Catatan: opsi antarmuka manajemen AWS S3 untuk membuat "folder" tidak kompatibel dengan S3FS yaitu membuat "folder" menggunakan antarmuka dan mencoba untuk mendapatkan daftar folder tersebut melalui titik pemasangan S3FS.
jldupont
Note2: membuat "folder" melalui S3FS kompatibel dengan antarmuka Manajemen AWS S3.
jldupont
Lihat jawaban @JaHax di bawah ini untuk contoh bagaimana melakukan ini dengan Boto. Mudah!
e.thompsy

Jawaban:

134

Tidak ada konsep folder atau direktori di S3. Anda dapat membuat nama file seperti "abc/xys/uvw/123.jpg", yang ditampilkan oleh banyak alat akses S3 S3Foxseperti struktur direktori, tetapi sebenarnya ini hanya satu file dalam satu keranjang.

pengguna240469
sumber
1
terima kasih atas jawabannya, jadi saya kira jika saya ingin melihat isi folder tertentu, saya perlu melintasi banyak file lain yang tidak perlu?
vito huang
7
ada konsep folder yang sangat jelas. jawabannya salah .. lihat jawaban elranu di bawah.
Boppity Bop
19
@BoppityBop: Tidak ada konsep folder di S3 . S3 tidak memiliki folder, meskipun konsol manajemen dan banyak alat merepresentasikan kunci dengan garis miring seperti itu. Lihat Bekerja dengan Folder dan baca bagiannya: "Jadi konsol menggunakan nama kunci objek untuk menyajikan folder dan hierarki. Di Amazon S3, Anda hanya memiliki bucket dan objek. "
Antti Haapala
7
Secara teknis mungkin bukan folder, tetapi tampaknya ada dukungan folder. Di konsol aws ketika melihat sebuah ember Anda dapat mengklik "Buat Folder" dan itu akan membuatnya, dan mereka bisa kosong, dan menarik meta data dari mereka.
phazei
4
S3 adalah penyimpanan nilai kunci DynamoDB kustom yang besar. Beberapa alat (termasuk konsol web AWS) menyediakan beberapa fungsionalitas yang meniru pohon direktori, tetapi Anda akan bekerja melawan S3 daripada bekerja dengannya jika aplikasi Anda menganggapnya setara dengan sistem file. Mengganti nama yang tampak seperti sebuah direktori, misalnya, memerlukan pemindaian melalui ruang kunci dan memodifikasi setiap kunci yang berisi 'nama direktori' yang dimaksud. Di sisi lain, sebagai penyimpanan nilai-kunci, tidak perlu membuat 'direktori induk' atau membersihkan 'folder kosong', yang diperlukan untuk meniru sistem file
scooter-dangle
51

Asumsikan Anda ingin membuat folder abc / 123 / di ember Anda, itu sangat mudah dengan Boto

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

Atau gunakan konsol

TomNg
sumber
7
Ini jawaban yang benar. Itu mungkin dengan Boto dan begitulah cara Anda melakukannya. Sebenarnya hanya new_key()itu yang Anda butuhkan. String yang dikirim ke fungsi dapat berupa abc/123/atau abc/123/newfile.txt. Apapun yang kamu suka. Saya suka membungkus ini dalam pernyataan if setelah saya mencoba mendapatkan apa yang saya harap ada di sana seperti ini: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Intinya, jika tidak ada, buatlah!
e.thompsy
1
Dengan api terbaru, bucket.key ('abc / 123 /') juga akan mendapatkan hasil yang sama.
light94
Menentukan kunci direktori juga berfungsi dengan mengunggah file dalam unggahan multi bagian mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138
20

Dengan AWS SDK .Net berfungsi dengan sempurna, cukup tambahkan "/" di akhir string nama folder:

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

Kemudian segarkan konsol AWS Anda, dan Anda akan melihat foldernya

elranu
sumber
Baru saja mencoba ini dengan pustaka ruby ​​AWS :: S3. Ini membuat "folder" dengan file dengan nama file kosong di dalamnya ... Jadi tidak benar-benar berfungsi. Solusi Mohammad Asgari bekerja dengan baik!
Nico
@Nico tetapi apakah Anda mengakhiri nama file dengan "/", seperti yang tertulis di komentar kode?
elranu
Ya, saya menambahkan garis miring. Saya melakukan AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico
Mengeluarkan "putObject" menggunakan string kosong dan garis miring pada akhirnya berhasil untuk saya. Saya menggunakan PHP dengan pustaka kelas tpyo / amazon-s3-php.
MikeMurko
2
@BoppityBop ya itu memiliki tombol buat folder, tapi itu mungkin hanya membuat semacam file kosong juga
jamylak
15

Gunakan ini:

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
sumber
Terima kasih atas bantuannya, saya mendapatkan kesalahan di bawah. dapatkah Anda membantu saya .botocore.exceptions.NoCredentialsError: Tidak dapat menemukan kredensial
Anvesh
1
Anda perlu menentukan kredensial aws Anda dengan cara tertentu. Lihat ini: boto3.readthedocs.io/en/latest/guide/…
Deepak GM
Terima kasih! Ini bekerja dengan sangat baik untuk saya
:)
4

Sangat mudah untuk membuat folder. Sebenarnya ini hanya membuat kunci.

Anda dapat melihat kode saya di bawah ini, saya sedang membuat folder dengan utc_time sebagai nama.

Ingatlah mengakhiri kunci dengan '/' seperti di bawah ini, ini menunjukkan itu adalah kunci:

Kunci = '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
sumber
4

Update untuk 2019, jika ingin membuat folder dengan path bucket_name / folder1 / folder2 kamu bisa menggunakan kode ini:

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
sumber
1

Meskipun Anda dapat membuat folder dengan menambahkan "/" ke nama_folder Anda. Di bawah kap, S3 mempertahankan struktur datar tidak seperti NFS biasa Anda.

var params = {
            Bucket: bucketName,
            Kunci: folderName + "/"
        };
s3.putObject (params, function (err, data) {});
vpage
sumber
1

Mencoba banyak metode di atas dan menambahkan garis miring /ke akhir nama kunci, untuk membuat direktori tidak berfungsi untuk saya:

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

Anda harus menyediakan Bodyparameter untuk membuat direktori:

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

Sumber: ryantuck dalam edisi boto3

azzamsa
sumber
0

S3 tidak memiliki struktur folder, Tetapi ada sesuatu yang disebut sebagai kunci.

Kita dapat membuat /2013/11/xyz.xlsdan akan ditampilkan sebagai folder di konsol. Tetapi bagian penyimpanan S3 akan menggunakan itu sebagai nama file.

Bahkan saat mengambil kami mengamati bahwa kami dapat melihat file di folder (atau kunci) tertentu dengan menggunakan ListObjectsmetode dan menggunakan Prefixparameter.

Balaram
sumber
0

Rupanya Anda sekarang dapat membuat folder di S3. Saya tidak yakin sejak kapan, tetapi saya memiliki keranjang di zona "Standar" dan dapat memilih Buat Folder dari tarik-turun Tindakan.

Perelx
sumber