2013-10-18 13 views
13

मैं S3 पर फ़ोल्डर या कुंजी बनाने के लिए Node.js के लिए AWS SDK का उपयोग कर रहा हूं। मैंने Google पर खोज की, लेकिन मुझे कुछ भी नहीं मिला। क्या कोई जानता है कि मैं Node.js के लिए AWS SDK के साथ अपनी बाल्टी के नीचे एक फ़ोल्डर कैसे बना सकता हूं? और आप यह कैसे जांच सकते हैं कि यह फ़ोल्डर आपकी बाल्टी में मौजूद है या नहीं?Node.js के लिए AWS SDK का उपयोग कर S3 पर फ़ोल्डर या कुंजी कैसे बनाएं?

यदि आप console.aws.amazon.com का उपयोग करते हैं, तो आप आसानी से अपनी बाल्टी में एक फ़ोल्डर बना सकते हैं। ऐसा लगता है कि मुझे यह पता नहीं लगा कि इसे Aode.js के लिए AWS SDK के साथ कैसे बनाया जाए?

उत्तर

8

बाल्टी में एक फ़ोल्डर बस एक और बाल्टी है। तो आप यह जांचने के लिए headBucket का उपयोग कर सकते हैं कि यह मौजूद है और इसे createBucket के साथ बनाएं यदि यह नहीं है। कुछ इस तरह:

var AWS = require('aws-sdk'), 
    s3 = new AWS.S3(), 
    bucketFolder = 'bucketA/folderInBucketA'; 

s3.headBucket({Bucket:bucketFolder},function(err,data){ 
    if(err){ 
     s3.createBucket({Bucket:bucketFolder},function(err,data){ 
      if(err){ throw err; } 
      console.log("Bucket created"); 
     }); 
    } else { 
     console.log("Bucket exists and we have access"); 
    } 
}); 

==== अद्यतन 2017/02/22 ====

के रूप में टिप्पणी में बताया, यह याद आती है की अग्रणी है। 2013 में मुझे लगता है कि इसका परिणाम "फ़ोल्डर" बनाया गया था (जहां तक ​​एस 3 यूआई का संबंध है)।

यदि आप उपरोक्त एडब्ल्यूएस एसडीके के साथ ऊपर चलाते हैं, तो यह बाल्टी "बाल्टीए" में कुंजी "फ़ोल्डरइनबकेट" पर एक खाली वस्तु बनाएगा। मुझे नहीं लगता कि यह किसी के लिए उपयोगी है कृपया इस उत्तर को पर ध्यान दें।

+11

यह प्रतिक्रिया काफी हद तक गलत है। एक बाल्टी में एक फ़ोल्डर "बस एक और बाल्टी" नहीं है। यह बिल्कुल एक बाल्टी नहीं है। एस 3 में फ़ोल्डर्स नहीं हैं। इसमें बाल्टी हैं और इसमें वस्तुओं हैं। अधिकांश लोग 'फ़ोल्डर' पर विचार करते हैं या तो एक वास्तविक वस्तु होती है जिसका कुंजी/में होता है, उदाहरण के लिए myfolder /, या यह उन वस्तुओं की उपस्थिति से अनुमान है, जिनकी चाबियाँ मायफॉल्डर/से शुरू होती हैं। – jarmod

+0

console.log ("बाल्टी निर्माण:" + गलती? "असफल": "सफलता"); हमेशा "बाल्टी निर्माण: असफल" वापस आ जाएगा। यह console.log होना चाहिए ("बाल्टी निर्माण:" + (गलती? "असफल": "सफलता"); – bpavlov

13

@ user2837831 का कोड अब जावास्क्रिप्ट एसडीके के नए संस्करण के साथ काम नहीं कर रहा है। तो मैं यहाँ कोड का संस्करण जोड़ रहा हूं जिसका उपयोग मैं node.js. का उपयोग करके बाल्टी के अंदर एक फ़ोल्डर बनाने के लिए कर रहा हूं। यह 2.1.31 एसडीके के साथ काम करता है। पैराम में कुंजी मान के अंत में '/' महत्वपूर्ण है - इसका उपयोग करके यह सोचता है कि आप एक फ़ोल्डर बनाने की कोशिश कर रहे हैं, न कि फ़ाइल।

var AWS = require('aws-sdk'); 
AWS.config.region = 'us-east-1'; 
var s3Client = new AWS.S3(); 

var params = { Bucket: 'your_bucket_goes_here', Key: 'folderInBucket/', ACL: 'public-read', Body:'body does not matter' }; 

s3Client.upload(params, function (err, data) { 
if (err) { 
    console.log("Error creating the folder: ", err); 
    } else { 
    console.log("Successfully created a folder on S3"); 

    } 
}); 
2

मुझे लगता है कि हम एक स्पष्ट निर्देशिका रचना कॉल और आवश्यकता नहीं है पाते हैं।

बस मेरे लिए निम्नलिखित कार्य करता है और मुझे आवश्यक रूप से एक निर्देशिका पदानुक्रम बनाता है।

var userFolder = 'your_bucket_name' + '/' + variable-with-dir-1-name + '/' + variable-with-dir-2-name; 
// IMPORTANT : No trailing '/' at the end of the last directory name 

AWS.config.region = 'us-east-1'; 

AWS.config.update({ 
    accessKeyId: 'YOUR_KEY_HERE', 
    secretAccessKey: 'your_secret_access_key_here' 
}); 

var bucket = new AWS.S3({ 
    params: { 
     Bucket: userFolder 
    } 
}); 

var contentToPost = { 
    Key: <<your_filename_here>>, 
    Body: <<your_file_here>>, 
    ContentEncoding: 'base64', 
    ContentType: <<your_file_content_type>>, 
    ServerSideEncryption: 'AES256' 
}; 

bucket.putObject(contentToPost, function (error, data) { 

    if (error) { 
     console.log("Error in posting Content [" + error + "]"); 
     return false; 
    } /* end if error */ 
    else { 
     console.log("Successfully posted Content"); 
    } /* end else error */ 
}) 
.on('httpUploadProgress',function (progress) { 
    // Log Progress Information 
    console.log(Math.round(progress.loaded/progress.total * 100) + '% done'); 
}); 
22

एस 3 में फ़ोल्डर या फ़ाइलें नहीं हैं; इसमें बाल्टी और वस्तुएं हैं। बाल्टी वस्तुओं का संग्रह करने के लिए उपयोग किया जाता है, और वस्तुओं में डेटा शामिल होता है (जो एक फ़ाइल हो सकती है) और मेटाडेटा (डेटा के बारे में जानकारी)।

आपको S3 में फ़ोल्डर संरचना को पूर्व-निर्माण करने की आवश्यकता नहीं है। कार/फोर्ड/सेडान/मौजूद नहीं होने पर भी आप ऑब्जेक्ट को कुंजी = कार/फोर्ड/सेडान/फोकस.png के साथ रख सकते हैं। इस मामले में:

  • putObject कॉल पर कारों/फोर्ड/सेडान/focus.png एक वस्तु का निर्माण करेगा, लेकिन यह की कारों/फोर्ड/सेडान मध्यवर्ती फ़ोल्डर संरचना का प्रतिनिधित्व करने के लिए कुछ भी नहीं बना होगा /।

  • वास्तविक फ़ोल्डर संरचना मौजूद नहीं है, लेकिन listObjects पर आपकी कॉल में delimiter =/के उपयोग के माध्यम से निहित है, और फ़ोल्डरों को कॉन्ट्रैक्टिक्स में वापस कर दिया जाएगा जबकि फ़ाइलों को सामग्री में वापस किया जाएगा।

  • आप headObject का उपयोग कर सेडान उप-फ़ोल्डर के लिए परीक्षण करने में सक्षम नहीं होंगे क्योंकि कार/फोर्ड/सेडान/वास्तव में मौजूद नहीं है (यह कोई ऑब्जेक्ट नहीं है)।इसके बजाय आप दो विकल्प हैं:

    उपसर्ग = कारों/फोर्ड/सेडान के साथ
    • कॉल listObjects/और फिर सामग्री में मिल, या
    • उपसर्ग = कारों/फोर्ड /, सीमांकक के साथ कॉल listObjects =/और फिर लगता है यह CommonPrefixes में।

यह है, तथापि, एक S3 उद्देश्य यह है कि एक फ़ोल्डर का प्रतिनिधित्व करता है, अगर तुम सच में करना चाहते हैं बनाने के लिए संभव है। Mybucket नामक बाल्टी में माईफोल्डर बनाने के लिए, आप बाल्टी = mybucket और key = myfolder/के साथ putObject कॉल जारी कर सकते हैं। पिछला आगे स्लैश नोट करें। इस मामले में:

  • फ़ोल्डर वास्तव में शून्य आकार का ऑब्जेक्ट है जिसका कुंजी/में समाप्त होता है। ध्यान दें कि यदि आप पीछे की ओर निकलते हैं/तो आपको शून्य-आकार वाली ऑब्जेक्ट मिल जाएगी जो किसी फ़ोल्डर की बजाय फ़ाइल होने लगती है।

  • आप myfolder/subfolder/mybucket में बाल्टी = mybucket और key = myfolder/subfolder/के साथ हेड ऑब्जेक्ट कॉल जारी करके परीक्षण कर सकते हैं।

अंत में, ध्यान दें कि आपके फ़ोल्डर सीमांकक उदाहरण के लिए आप की तरह कुछ भी, हो सकता है + क्योंकि यह बस कुंजी का हिस्सा है और वास्तव में एक फ़ोल्डर विभाजक (वहाँ कोई फ़ोल्डर नहीं है) नहीं है। यदि आप चाहें तो कॉल करने के लिए आप कॉल ऑब्जेक्ट्स कॉल से अपने फ़ोल्डर डिलीमीटर को बदल सकते हैं।

संबंधित मुद्दे