Amazon S3 boto - फोल्डर कैसे बनाये?


123

मैं botoअमेज़न s3 के लिए लाइब्रेरी का उपयोग करके बाल्टी के नीचे एक फ़ोल्डर कैसे बना सकता हूं ?

मैंने मैनुअल का पालन किया, और अनुमति, मेटाडेटा आदि के साथ चाबियाँ बनाईं, लेकिन जहां बोटो के प्रलेखन में यह नहीं बताया गया है कि बाल्टी के नीचे फ़ोल्डर कैसे बनाया जाए, या बाल्टी में फ़ोल्डर के तहत एक फ़ोल्डर बनाया जाए।


ऐसा लगता है कि अमेज़ॅन s3 में फ़ोल्डर की अवधारणा नहीं है, कुछ इसे प्राप्त करने के लिए "फ़ोल्डर / test.txt 'जैसे नाम के साथ कुंजी बनाने का सुझाव देते हैं। मैंने फ़ोल्डर बनाने के लिए फ़ायरफ़ॉक्स एस 3 प्लगइन का उपयोग करने की कोशिश की, और बोटो में सभी कुंजी को सूचीबद्ध किया, यह आउटपुट करता है। फ़ोल्डर मैं बस के रूप में बनाया "<कुंजी: vitoshares, हर कोई $ फ़ोल्डर $>], तो मैं कैसे / देख सकते हैं / इस फ़ोल्डर से सामग्री को जोड़ने / संशोधित करने के लिए?
वीटो हुआंग

नोट: "फ़ोल्डर" बनाने के लिए AWS S3 प्रबंधन इंटरफ़ेस विकल्प S3FS के साथ संगत नहीं है। अर्थात इंटरफ़ेस का उपयोग करके "फ़ोल्डर" बनाएं और S3FS माउंट पॉइंट के माध्यम से उक्त फ़ोल्डर की सूची प्राप्त करने का प्रयास करें।
जुलडूपोंट

नोट 2: S3FS के माध्यम से एक "फ़ोल्डर" बनाना AWS S3 प्रबंधन इंटरफ़ेस के साथ संगत है।
१२:१३

बोटो के साथ ऐसा करने के एक उदाहरण के लिए नीचे @JaHax जवाब देखें। आसान!
e.thompsy

जवाबों:


134

S3 में फ़ोल्डर या निर्देशिका की कोई अवधारणा नहीं है। आप फ़ाइल नाम जैसे बना सकते हैं "abc/xys/uvw/123.jpg", जिसमें कई S3 एक्सेस टूल जैसे S3Foxडायरेक्टरी स्ट्रक्चर की तरह दिखाई देते हैं, लेकिन यह वास्तव में एक बाल्टी में केवल एक फ़ाइल है।


1
उत्तर के लिए धन्यवाद, इसलिए मुझे लगता है कि अगर मैं किसी विशेष फ़ोल्डर की सामग्री को देखना चाहता हूं, तो मुझे बहुत सी अन्य अनावश्यक फ़ाइलों को ट्रैस करना होगा?
वीटो हुआंग

7
फ़ोल्डरों की बहुत अच्छी तरह से परिभाषित अवधारणा है। उत्तर गलत है .. नीचे ऐलानू उत्तर देखें।
बोपिटी बोप

19
@BoppityBop: S3 में फ़ोल्डर्स की कोई अवधारणा नहीं है । S3 में फ़ोल्डर नहीं हैं, भले ही प्रबंधन कंसोल और कई उपकरण इस तरह से स्लैश के साथ कुंजियों का प्रतिनिधित्व करते हैं। फोल्डर्स के साथ कार्य करना देखें और भाग पढ़ें: "तो कंसोल फ़ोल्डर और पदानुक्रम को प्रस्तुत करने के लिए ऑब्जेक्ट कुंजी नामों का उपयोग करता है। अमेज़ॅन एस 3 में, आपके पास केवल बाल्टी और ऑब्जेक्ट हैं। "
एंटटी हवाला

7
यह तकनीकी रूप से एक फ़ोल्डर नहीं हो सकता है, लेकिन निश्चित रूप से फ़ोल्डर समर्थन प्रतीत होता है। अक्स कंसोल में जब एक बाल्टी को देखते हैं तो आप "क्रिएट फ़ोल्डर" पर क्लिक कर सकते हैं और यह एक बना देगा, और वे खाली हो सकते हैं, और उनसे मेटा डेटा खींच सकते हैं।
फेजी

4
S3 एक विशाल, कस्टम डायनेमोडी की-वैल्यू स्टोर है। कुछ टूल (AWS वेब कंसोल सहित) कुछ कार्यक्षमता प्रदान करते हैं जो एक डायरेक्टरी ट्री की नकल करते हैं, लेकिन आप S3 के खिलाफ काम करने के बजाय इसके साथ काम करेंगे, यदि आपके एप्लिकेशन यह मानते हैं कि यह फाइल सिस्टम के समतुल्य है। उदाहरण के लिए, जो प्रतीत होता है उसका नाम बदलना, कुंजी क्षेत्र के माध्यम से स्कैन करना और प्रश्न में 'निर्देशिका नाम' वाली प्रत्येक कुंजी को संशोधित करना है। दूसरी ओर, एक कुंजी-मूल्य की दुकान होने के नाते, 'मूल निर्देशिका' बनाने या 'खाली फ़ोल्डर' को साफ करने की कोई आवश्यकता नहीं है, जो एक फ़ाइल सिस्टम की नकल करने की आवश्यकता होगी
स्कूटर-दंगल

51

मान लें कि आप अपनी बाल्टी में फ़ोल्डर abc / 123 / बनाना चाहते हैं, यह Boto के साथ केक का एक टुकड़ा है

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

या कंसोल का उपयोग करें


7
यह सही जवाब है। यह बोटो के साथ संभव है और आप इसे करते हैं। वास्तव में new_key()आप सभी की जरूरत है। समारोह में भेजी जाने वाली स्ट्रिंग abc/123/या हो सकती है abc/123/newfile.txt। आप जो भी पसंद करें। मैं इसे एक बयान में लपेटना पसंद करता हूं, इसके बाद मैं यह पाने की कोशिश करता हूं कि मुझे क्या उम्मीद है इस तरह से है: key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)अनिवार्य रूप से, अगर यह वहां नहीं है, तो इसे बनाएं!
e.thompsy

1
नवीनतम एपीआई के साथ, बकेट.की ('एबीसी / 123 /') भी उसी परिणाम को प्राप्त करेगा।
light94

एक निर्देशिका कुंजी निर्दिष्ट करना भी मल्टीपार्ट अपलोड में फाइल अपलोड करने के साथ काम करता हैmp = self._bucket.initiate_multipart_upload(bucket_key)
तूफान_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 माणिक पुस्तकालय के साथ यह कोशिश की। यह एक फ़ाइल के साथ एक "फ़ोल्डर" बनाता है जिसमें एक खाली फ़ाइल नाम होता है ... इसलिए यह वास्तव में काम नहीं करता है। मोहम्मद असगरी का हल हालांकि ठीक काम करता है!
निको

@ निको लेकिन क्या आपने "/" के साथ फ़ाइल नाम समाप्त किया था, जैसा कि कोड टिप्पणी कहती है?
elranu

हां, मैंने स्लैश जोड़ा। मैंने AWS :: S3 :: S3Object.store ('परीक्षण /', '', 'my_bucket')
Nico

जारी किए गए "putObject" का उपयोग करते हुए खाली स्ट्रिंग और स्लैश ने मेरे लिए काम किया। मैं tpyo / amazon-s3-php-class लाइब्रेरी के साथ PHP का उपयोग कर रहा हूं।
मिकुरको

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.exception.NoCredentialsError: क्रेडेंशियल्स का पता लगाने में असमर्थ
Anvesh

1
आपको किसी तरह से या दूसरे तरीके से अपने आरो क्रेडेंशियल्स को निर्दिष्ट करने की आवश्यकता है। इसे देखें: boto3.readthedocs.io/en/latest/guide/…
दीपक जीएम

धन्यवाद! इसने मेरे लिए बहुत अच्छा काम किया
:)

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 के लिए अपडेट करें, यदि आप पथ बकेट_नाम / फ़ोल्डर 1 / फ़ोल्डर 2 के साथ एक फ़ोल्डर बनाना चाहते हैं, तो आप इस कोड का उपयोग कर सकते हैं:

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

यद्यपि आप अपने फ़ोल्डर_नाम में "/" जोड़कर एक फ़ोल्डर बना सकते हैं। हुड के तहत, S3 आपके नियमित NFS के विपरीत सपाट संरचना रखता है।

वर परम् = {
            बाल्टी: बाल्टी का नाम,
            कुंजी: फ़ोल्डरनाम + "/"
        };
s3.putObject (params, function (इरेट, डेटा) {});

1

ऊपर कई विधि की कोशिश की और /कुंजी नाम के अंत में आगे स्लैश जोड़ने , निर्देशिका बनाने के लिए मेरे लिए काम नहीं किया:

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

Bodyनिर्देशिका बनाने के लिए आपको पैरामीटर की आपूर्ति करनी होगी :

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

स्रोत: बोटो 3 अंक में रयानटुक


0

S3 में एक फ़ोल्डर संरचना नहीं है, लेकिन कुंजी के रूप में कुछ कहा जाता है।

हम बना सकते हैं /2013/11/xyz.xlsऔर कंसोल में फ़ोल्डर के रूप में दिखाया जाएगा। लेकिन S3 का स्टोरेज हिस्सा फाइल नाम के रूप में लेगा।

पुनर्प्राप्त करते समय भी हम देखते हैं कि हम ListObjectsविधि का उपयोग करके और Prefixपैरामीटर का उपयोग करके विशेष फ़ोल्डर (या कुंजियों) में फाइलें देख सकते हैं ।


0

जाहिरा तौर पर अब आप S3 में फ़ोल्डर बना सकते हैं। मुझे यकीन नहीं है कि कब से है, लेकिन मेरे पास "मानक" क्षेत्र में एक बाल्टी है और एक्शन ड्रॉपडाउन से क्रिएट फ़ोल्डर चुन सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.