Amazon S3 boto - cách tạo thư mục?


123

Làm cách nào để tạo một thư mục trong một nhóm bằng cách sử dụng botothư viện cho Amazon s3?

Tôi đã làm theo hướng dẫn và tạo các khóa với quyền, siêu dữ liệu, v.v., nhưng không có nơi nào trong tài liệu của boto, nó mô tả cách tạo các thư mục trong một nhóm hoặc tạo một thư mục trong các thư mục trong nhóm.


Có vẻ như amazon s3 không có khái niệm về thư mục, một số đề xuất tạo khóa với tên như "folder / test.txt 'để sử dụng nó. Tôi đã thử sử dụng plugin firefox s3 để tạo thư mục và liệt kê tất cả các khóa trong boto, nó xuất ra thư mục tôi vừa tạo là "<Key: vitoshares, mọi người_ $ thư mục $>], vậy làm cách nào để xem / thêm / sửa đổi nội dung vào / từ thư mục này?
vito huang 21/12/09

Lưu ý: tùy chọn giao diện quản lý AWS S3 để tạo "thư mục" không tương thích với S3FS, tức là tạo một "thư mục" bằng giao diện và cố gắng lấy danh sách thư mục đã nói thông qua điểm gắn kết S3FS.
jldupont

Lưu ý 2: Tuy nhiên, việc tạo "thư mục" thông qua S3FS tương thích với giao diện Quản lý AWS S3.
jldupont

Xem câu trả lời của @JaHax bên dưới để biết ví dụ về cách thực hiện việc này với Boto. Dễ dàng!
e.thompsy

Câu trả lời:


134

Không có khái niệm về thư mục hoặc thư mục trong S3. Bạn có thể tạo các tên tệp giống như "abc/xys/uvw/123.jpg"mà nhiều công cụ truy cập S3 thích S3Foxhiển thị giống như cấu trúc thư mục, nhưng nó thực sự chỉ là một tệp duy nhất trong một nhóm.


1
Cảm ơn vì câu trả lời, vì vậy tôi đoán nếu tôi muốn xem nội dung của một thư mục cụ thể, tôi sẽ cần xem qua rất nhiều tệp không cần thiết khác?
vito huang

7
có khái niệm rất rõ ràng về thư mục. câu trả lời là không chính xác .. xem câu trả lời elranu dưới đây.
Boppity Bop

19
@BoppityBop: Không có khái niệm về thư mục trong S3 . S3 không có thư mục, mặc dù bảng điều khiển quản lý và nhiều công cụ thể hiện các phím bằng dấu gạch chéo như vậy. Xem công tác với thư mục và đọc phần: "Vì vậy, giao diện điều khiển sử dụng đối tượng tên chìa khóa để các thư mục và hệ thống phân cấp hiện nay. Trong Amazon S3, bạn chỉ có xô và các đối tượng. "
Antti Haapala

7
Về mặt kỹ thuật, nó có thể không phải là một thư mục, nhưng dường như chắc chắn là có hỗ trợ thư mục. Trong bảng điều khiển aws khi nhìn vào một nhóm, bạn có thể nhấp vào "Tạo Thư mục" và nó sẽ tạo một nhóm và chúng có thể trống và lấy dữ liệu meta từ chúng.
phazei

4
S3 là một kho lưu trữ khóa-giá trị DynamoDB tùy chỉnh, khổng lồ. Một số công cụ (bao gồm cả bảng điều khiển web AWS) cung cấp một số chức năng bắt chước cây thư mục, nhưng bạn sẽ làm việc với S3 thay vì làm việc với nó nếu các ứng dụng của bạn cho rằng nó tương đương với hệ thống tệp. Ví dụ: đổi tên những gì có vẻ là một thư mục, yêu cầu quét qua không gian khóa và sửa đổi mọi khóa có chứa 'tên thư mục' được đề cập. Mặt khác, là một nơi lưu trữ khóa-giá trị, không cần tạo 'thư mục mẹ' hoặc dọn dẹp 'các thư mục trống', điều này bắt chước hệ thống tệp sẽ yêu cầu
scooter-dangle

51

Giả sử bạn muốn tạo thư mục abc / 123 / trong nhóm của mình, đó là một miếng bánh với Boto

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

Hoặc sử dụng bảng điều khiển


7
Đây là câu trả lời chính xác. Điều đó có thể xảy ra với Boto và đây là cách bạn làm. Trên thực tế new_key()là tất cả những gì bạn cần. Chuỗi được gửi đến hàm có thể là abc/123/hoặc abc/123/newfile.txt. Bất cứ thứ gì bạn thích. Tôi muốn kết thúc điều này trong một câu lệnh if sau khi tôi cố gắng đạt được những gì tôi hy vọng ở đó như sau: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)Về cơ bản, nếu nó không có ở đó, hãy tạo nó!
e.thompsy

1
Với api mới nhất, bucket.key ('abc / 123 /') cũng sẽ đạt được kết quả tương tự.
light94

Chỉ định một khóa thư mục cũng làm việc với các tập tin tải lên trong cập nhật nhiều phần dữ liệu mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

Với AWS SDK .Net hoạt động hoàn hảo, chỉ cần thêm "/" vào cuối chuỗi tên thư mục:

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

Sau đó, làm mới bảng điều khiển AWS của bạn và bạn sẽ thấy thư mục


Chỉ cần thử điều này với thư viện ruby ​​AWS :: S3. Nó tạo một "thư mục" với một tệp có tên tệp trống trong đó ... Vì vậy, nó không thực sự hoạt động. Mặc dù vậy, giải pháp của Mohammad Asgari hoạt động tốt!
Nico

@Nico nhưng bạn đã kết thúc tên tệp bằng dấu "/", giống như nhận xét mã nói?
elranu

Vâng, tôi đã thêm dấu gạch chéo. Tôi đã thực hiện AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

Đã phát hành "putObject" bằng cách sử dụng chuỗi trống và dấu gạch chéo ở cuối phù hợp với tôi. Tôi đang sử dụng PHP với thư viện lớp tpyo / amazon-s3-php.
MikeMurko

2
@BoppityBop có nó có một nút tạo thư mục, nhưng mà có lẽ chỉ làm cho một số loại tập tin rỗng cũng
jamylak

15

Dùng cái này:

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

Cảm ơn sự giúp đỡ, tôi nhận được lỗi dưới đây. bạn có thể vui lòng giúp tôi .botocore.exceptions.NoCredentialsError: Không thể định vị thông tin đăng nhập
Anvesh

1
Bạn cần chỉ định thông tin đăng nhập aws của mình theo cách này hay cách khác. Kiểm tra điều này: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

Cảm ơn! Điều này làm việc rất tốt cho tôi:)
igorkf


4

Thật dễ dàng để tạo các thư mục. Thực ra nó chỉ là tạo khóa.

Bạn có thể thấy đoạn mã dưới đây của tôi, tôi đã tạo một thư mục với tên utc_time.

Hãy nhớ kết thúc khóa bằng '/' như bên dưới, điều này cho thấy đó là một khóa:

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

Cập nhật cho năm 2019, nếu bạn muốn tạo một thư mục với đường dẫn bucket_name / folder1 / folder2, bạn có thể sử dụng mã này:

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

Mặc dù bạn có thể tạo một thư mục bằng cách thêm "/" vào folder_name của mình. Dưới mui xe, S3 duy trì cấu trúc phẳng không giống như NFS thông thường của bạn.

var params = {
            Bucket: bucketName,
            Khóa: folderName + "/"
        };
s3.putObject (params, function (err, data) {});

1

Đã thử nhiều phương pháp ở trên và thêm dấu gạch chéo /vào cuối tên khóa, để tạo thư mục không hoạt động với tôi:

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

Bạn phải cung cấp Bodytham số để tạo thư mục:

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

Nguồn: ryantuck in boto3 issue


0

S3 không có cấu trúc thư mục, nhưng có một thứ được gọi là khóa.

Chúng tôi có thể tạo /2013/11/xyz.xlsvà sẽ được hiển thị dưới dạng thư mục trong bảng điều khiển. Nhưng phần lưu trữ của S3 sẽ lấy đó làm tên tệp.

Ngay cả khi truy xuất, chúng tôi quan sát thấy rằng chúng tôi có thể thấy các tệp trong thư mục (hoặc khóa) cụ thể bằng cách sử dụng ListObjectsphương thức và sử dụng Prefixtham số.


0

Rõ ràng bây giờ bạn có thể tạo các thư mục trong S3. Tôi không chắc từ khi nào, nhưng tôi có một nhóm trong vùng "Chuẩn" và có thể chọn Tạo Thư mục từ Hành động thả xuống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.