2009-09-23 10 views
14

मेरे पास मेरी एस 3 बाल्टी में एक कुंजी में निहित फ़ाइल है। मैं एक नई कुंजी बनाना चाहता हूं, जिसमें एक ही फाइल होगी। क्या यह फ़ाइल डाउनलोड किए बिना करना संभव है? मैं पाइथन (और अधिमानतः बोटो लाइब्रेरी) में एक समाधान की तलाश में हूं।पायथन (और बोटो) का उपयोग कर अमेज़ॅन एस 3 में एक कुंजी क्लोन कैसे करें?

उत्तर

2

एस 3 वस्तु प्रतिलिपि द्वारा ऑब्जेक्ट की अनुमति देता है। CopyObject ऑपरेशन किसी ऑब्जेक्ट की एक प्रति बनाता है जब आप स्रोत ऑब्जेक्ट की कुंजी और बाल्टी निर्दिष्ट करते हैं और लक्ष्य गंतव्य की कुंजी और बाल्टी निर्दिष्ट करते हैं। सुनिश्चित नहीं है कि बोटो में कॉम्पैक्ट कार्यान्वयन है या नहीं।

4

बोटो के स्रोत कोड के माध्यम से ब्राउज़ करना मैंने पाया कि कुंजी ऑब्जेक्ट में "कॉपी" विधि है। CopyObject ऑपरेशन के बारे में आपके सुझाव के लिए धन्यवाद।

+0

सहायता: 'प्रतिलिपि (स्वयं, dst_bucket, dst_key, मेटाडाटा = कोई नहीं, reduced_redundancy = झूठी, preserve_acl = झूठी, encrypt_key = झूठी)' Boto की विधि। s3.key.Key उदाहरण इस कुंजी को दूसरी बाल्टी में कॉपी करें। –

14

कहाँ बाल्टी गंतव्य बाल्टी है:

bucket.copy_key(new_key,source_bucket,source_key) 
+1

यह वास्तव में कुंजी को पढ़ता है और इसे नई बाल्टी में रखता है - जो आप नहीं चाहते हैं। माफ़ कीजिये। –

+0

मुझे विश्वास नहीं है कि यह सही है। यह आईएमओ का सबसे अच्छा जवाब है। 'Copy_key' विधि एक पुट अनुरोध में 'x-amz-copy-source' शीर्षलेख को पास करती है, जो आपकी मशीन पर डाउनलोड किए बिना सीधे क्षेत्र से क्षेत्र में प्रतिलिपि बनाने के लिए S3 को बताती है। – sergiopereira

+0

यहां उन्हें दस्तावेज़ हैं: http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers

2

हालांकि कोई भी नहीं पूछा, मैंने सोचा कि यह कैसे simples3 के साथ ऐसा करना दिखाने के लिए प्रासंगिक हो सकता है:

>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public") 

मुझे यकीन है कि नहीं कर रहा हूँ क्या बोटो यहां है, लेकिन यह ध्यान देने योग्य है कि अनुमतियां (एसीएल) एस 3 द्वारा प्रतिलिपि बनाई जाएगी, अगर इसे और कुछ निर्दिष्ट नहीं किया गया है तो इसे "निजी" पर रीसेट कर दिया जाएगा। एसीएल की प्रतिलिपि बनाने के लिए, आपको पहले इसके लिए पूछना होगा।

+0

मैं अनुमतियों (बग का सामना करने के बाद) के बारे में इस टिप्पणी को दूसरा करता हूं 'dest_bucket .copy_key (key.name, src_bucket_name, key.name, preserve_acl = True) ' – nsof

0

ध्यान दें कि कुंजी ऑब्जेक्ट पर 'प्रतिलिपि' विधि में "preserve_acl" पैरामीटर (डिफ़ॉल्ट रूप से गलत) है जो स्रोत के एसीएल को गंतव्य ऑब्जेक्ट में कॉपी करेगा। मॉड्यूल boto.s3.key में विधि प्रति पर

9
from boto.s3.key import Key 

#Get source key from bucket by name 
source_key = source_bucket.get_key(source_key_name) 

#Copy source key to a new bucket with a new key name (can be the same as source) 
#Note: source_key is Key 
source_key.copy(dest_bucket_name,dest_key_name) 

#The signature of boto's Key class: 
def copy(self, dst_bucket, dst_key, metadata=None, 
      reduced_redundancy=False, preserve_acl=False, 
      encrypt_key=False, validate_dst_bucket=True) 

#set preserve_acl=True to copy the acl from the source key 
संबंधित मुद्दे