Amazon S3 boto - จะสร้างโฟลเดอร์ได้อย่างไร


123

ฉันจะสร้างโฟลเดอร์ภายใต้ที่เก็บข้อมูลโดยใช้ไฟล์ botoไลบรารีสำหรับ Amazon s3 ได้อย่างไร

ฉันทำตามคู่มือและสร้างคีย์โดยได้รับอนุญาตข้อมูลเมตา ฯลฯ แต่ไม่มีที่ใดในเอกสารของ boto ที่อธิบายวิธีสร้างโฟลเดอร์ภายใต้ที่เก็บข้อมูลหรือสร้างโฟลเดอร์ภายใต้โฟลเดอร์ในที่เก็บข้อมูล


ดูเหมือนว่า amazon s3 จะไม่มีแนวคิดเรื่องโฟลเดอร์บางคนแนะนำให้สร้างคีย์ที่มีชื่อเช่น "โฟลเดอร์ / test.txt 'เพื่อหลีกเลี่ยงมันฉันลองใช้ปลั๊กอิน firefox s3 เพื่อสร้างโฟลเดอร์และแสดงรายการคีย์ทั้งหมดใน boto มันจะส่งออก โฟลเดอร์ที่ฉันเพิ่งสร้างเป็น "<Key: vitoshares, everyone_ $ folder $>] ดังนั้นฉันจะดู / เพิ่ม / แก้ไขเนื้อหาไปยัง / จากโฟลเดอร์นี้ได้อย่างไร
vito huang

หมายเหตุ: ตัวเลือกอินเทอร์เฟซการจัดการ AWS S3 สำหรับการสร้าง "โฟลเดอร์" ไม่สามารถทำงานร่วมกับ S3FS ได้เช่นสร้าง "โฟลเดอร์" โดยใช้อินเทอร์เฟซและพยายามรับรายชื่อโฟลเดอร์ดังกล่าวผ่านจุดเชื่อมต่อ S3FS
jldupont

หมายเหตุ 2: การสร้าง "โฟลเดอร์" ผ่าน S3FS เข้ากันได้กับอินเทอร์เฟซ AWS S3 Management
jldupont

ดูคำตอบของ @JaHax ด้านล่างสำหรับตัวอย่างวิธีดำเนินการกับ Boto ง่าย!
e.thompsy

คำตอบ:


134

ไม่มีแนวคิดเกี่ยวกับโฟลเดอร์หรือไดเรกทอรีใน S3 คุณสามารถสร้างชื่อไฟล์ที่ต้องการ"abc/xys/uvw/123.jpg"ซึ่งเครื่องมือการเข้าถึง S3 จำนวนมากเช่นS3Foxแสดงเหมือนโครงสร้างไดเร็กทอรี แต่จริงๆแล้วเป็นเพียงไฟล์เดียวในที่เก็บข้อมูล


1
ขอบคุณสำหรับคำตอบดังนั้นฉันเดาว่าถ้าฉันต้องการดูเนื้อหาของโฟลเดอร์ใดโฟลเดอร์หนึ่งฉันจะต้องสำรวจไฟล์ที่ไม่จำเป็นอื่น ๆ อีกมากมาย?
vito huang

7
มีแนวคิดของโฟลเดอร์ที่กำหนดไว้เป็นอย่างดี คำตอบไม่ถูกต้อง .. ดูคำตอบของ elranu ด้านล่าง
Boppity Bop

19
@BoppityBop: มีแนวคิดของโฟลเดอร์ที่ไม่มีในS3 S3 ไม่มีโฟลเดอร์แม้ว่าคอนโซลการจัดการและเครื่องมือจำนวนมากจะแสดงคีย์ที่มีเครื่องหมายทับเช่นนี้ โปรดดูการทำงานกับโฟลเดอร์และอ่านส่วน: "ดังนั้นคอนโซลจึงใช้ชื่อคีย์อ็อบเจ็กต์เพื่อนำเสนอโฟลเดอร์และลำดับชั้น ใน Amazon S3 คุณมีเฉพาะที่เก็บข้อมูลและอ็อบเจ็กต์เท่านั้น "
Antti Haapala

7
ในทางเทคนิคอาจไม่ใช่โฟลเดอร์ แต่ดูเหมือนว่าจะมีการรองรับโฟลเดอร์อย่างแน่นอน ในคอนโซล aws เมื่อดูที่เก็บข้อมูลคุณสามารถคลิก "สร้างโฟลเดอร์" จากนั้นจะสร้างโฟลเดอร์ขึ้นมาและสามารถว่างและดึงข้อมูลเมตาจากพวกเขาได้
phazei

4
S3 เป็นที่เก็บคีย์ - ค่า DynamoDB ขนาดยักษ์ที่กำหนดเอง เครื่องมือบางอย่าง (รวมถึงเว็บคอนโซล AWS) มีฟังก์ชันการทำงานบางอย่างที่เลียนแบบแผนผังไดเรกทอรี แต่คุณจะทำงานกับ S3 แทนที่จะใช้งานได้หากแอปพลิเคชันของคุณคิดว่าเทียบเท่ากับระบบไฟล์ ตัวอย่างเช่นการเปลี่ยนชื่อสิ่งที่ดูเหมือนจะเป็นไดเร็กทอรีต้องใช้การสแกนผ่านคีย์สเปซและแก้ไขทุกคีย์ที่มี 'ชื่อไดเร็กทอรี' ที่เป็นปัญหา ในทางกลับกันการเป็นที่เก็บคีย์ - ค่าไม่จำเป็นต้องสร้าง 'ไดเร็กทอรีหลัก' หรือทำความสะอาด 'โฟลเดอร์ว่าง' ซึ่งการเลียนแบบระบบไฟล์จะต้องมี
scooter-dangle

51

สมมติว่าคุณต้องการสร้างโฟลเดอร์ abc / 123 / ในถังของคุณมันเป็นเค้กชิ้นหนึ่งกับ Boto

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

หรือใช้คอนโซล


7
นี่คือคำตอบที่ถูกต้อง เป็นไปได้ด้วย Boto และนี่คือวิธีที่คุณทำ จริงๆแล้วnew_key()คือทั้งหมดที่คุณต้องการ สตริงที่ส่งไปยังฟังก์ชั่นที่อาจจะหรือabc/123/ abc/123/newfile.txtตามที่คุณต้องการ ฉันชอบที่จะสรุปสิ่งนี้ในคำสั่ง if หลังจากที่ฉันพยายามได้สิ่งที่ฉันหวังว่าจะมีดังนี้: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)โดยพื้นฐานแล้วถ้าไม่มีให้สร้างมันขึ้นมา!
e.thompsy

1
ด้วย api ล่าสุด bucket.key ('abc / 123 /') ก็จะได้ผลลัพธ์เช่นเดียวกัน
light94

การระบุคีย์ไดเรกทอรียังใช้ได้กับการอัปโหลดไฟล์ในการอัปโหลดหลายส่วน mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138

20

ด้วย AWS SDK .Net ทำงานได้อย่างสมบูรณ์เพียงเพิ่ม "/" ที่ท้ายสตริงชื่อโฟลเดอร์:

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

จากนั้นรีเฟรชคอนโซล AWS ของคุณแล้วคุณจะเห็นโฟลเดอร์


เพิ่งลองสิ่งนี้กับไลบรารีทับทิม AWS :: S3 มันสร้าง "โฟลเดอร์" โดยมีไฟล์ที่มีชื่อไฟล์ว่างอยู่ ... ดังนั้นมันจึงใช้งานไม่ได้จริงๆ วิธีแก้ปัญหาของ Mohammad Asgari ทำงานได้ดี!
Nico

@Nico แต่คุณลงท้ายชื่อไฟล์ด้วย "/" อย่างที่โค้ดคอมเม้นบอกหรือเปล่า
elranu

ใช่ฉันเพิ่มเครื่องหมายทับ ฉันทำ AWS :: S3 :: S3Object.store ('test /', '', 'my_bucket')
Nico

ออก "putObject" โดยใช้สตริงว่างและสแลชที่ปลายได้ผลสำหรับฉัน ฉันใช้ PHP กับไลบรารี tpyo / amazon-s3-php-class
MikeMurko

2
@BoppityBop ใช่มันมีปุ่มสร้างโฟลเดอร์ แต่นั่นอาจทำให้ไฟล์ว่างบางประเภทเช่นกัน
jamylak

15

ใช้สิ่งนี้:

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

ขอบคุณสำหรับความช่วยเหลือฉันได้รับข้อผิดพลาดด้านล่าง คุณช่วยฉันหน่อยได้ไหม .botocore.exceptions.NoCredentialsError: ไม่พบข้อมูลรับรอง
Anvesh

1
คุณต้องระบุข้อมูลรับรอง aws ของคุณไม่ทางใดก็ทางหนึ่ง ตรวจสอบสิ่งนี้: boto3.readthedocs.io/en/latest/guide/…
Deepak GM

ขอบคุณ! สิ่งนี้ได้ผลดีมากสำหรับฉัน
:)

7

ใส่ "_ $ โฟลเดอร์ $" ต่อท้ายชื่อโฟลเดอร์ของคุณแล้วเรียกใส่

    String extension = "_$folder$";
    s3.putObject("MyBucket", "MyFolder"+ extension, new ByteArrayInputStream(new byte[0]), null);

ดู: http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/


วิธีสร้างโฟลเดอร์นี้ใช้ไม่ได้แล้ว คุณควรลองวิธีที่แนะนำโดย @TomNg
radalin

4

สร้างโฟลเดอร์ได้ง่ายมาก จริงๆแล้วมันเป็นเพียงการสร้างกุญแจ

คุณสามารถดูรหัสด้านล่างของฉันฉันกำลังสร้างโฟลเดอร์โดยใช้ utc_time เป็นชื่อ

อย่าลืมลงท้ายคีย์ด้วย'/'ดังต่อไปนี้แสดงว่าเป็นคีย์:

คีย์ = '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

อัปเดตสำหรับปี 2019 หากคุณต้องการสร้างโฟลเดอร์ด้วยพา ธ bucket_name / folder1 / folder2 คุณสามารถใช้รหัสนี้:

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

แม้ว่าคุณจะสามารถสร้างโฟลเดอร์ได้โดยการต่อท้าย "/" ที่ folder_name ของคุณ ภายใต้ฝากระโปรง S3 มีโครงสร้างที่เรียบไม่เหมือน NFS ทั่วไปของคุณ

var params = {
            ถัง: bucketName,
            คีย์: folderName + "/"
        };
s3.putObject (พารามิเตอร์ฟังก์ชัน (ข้อผิดพลาดข้อมูล) {});

1

ลองหลายวิธีด้านบนและเพิ่มเครื่องหมายทับ/ที่ท้ายชื่อคีย์เพื่อสร้างไดเร็กทอรีไม่ได้ผลสำหรับฉัน:

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

คุณต้องจัดหาBodyพารามิเตอร์เพื่อสร้างไดเร็กทอรี:

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

ที่มา: ryantuck ใน boto3 issue


0

S3 ไม่มีโครงสร้างโฟลเดอร์ แต่มีสิ่งที่เรียกว่าเป็นคีย์

เราสามารถสร้าง/2013/11/xyz.xlsและจะแสดงเป็นโฟลเดอร์ในคอนโซล แต่ส่วนที่เก็บข้อมูลของ S3 จะใช้ชื่อไฟล์นั้น

แม้ในขณะเรียกค้นเราสังเกตว่าเราสามารถเห็นไฟล์ในโฟลเดอร์เฉพาะ (หรือคีย์) โดยใช้ListObjectsวิธีการและใช้Prefixพารามิเตอร์


0

เห็นได้ชัดว่าคุณสามารถสร้างโฟลเดอร์ใน S3 ได้แล้ว ฉันไม่แน่ใจว่าตั้งแต่เมื่อไหร่ แต่ฉันมีที่เก็บข้อมูลในโซน "มาตรฐาน" และสามารถเลือกสร้างโฟลเดอร์จากรายการแบบเลื่อนลงการดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.