2012-03-30 11 views
7

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मेरे अमेज़ॅन एस 3 बाल्टी पर कोई फ़ोल्डर मौजूद है या नहीं और यदि मैं इसे बनाना नहीं चाहता हूं।अमेज़ॅन एस 3 प्रबंधन कंसोल के माध्यम से बनाम .NET एसडीके के माध्यम से फ़ोल्डर बनाना

फिलहाल

मैं फ़ोल्डर इस प्रकार नेट SDK का उपयोग बना सकते हैं:

 public bool DoesFolderExist(string key, string bucketName) 
    { 
     try 
     { 
      S3Response response = m_S3Client.GetObjectMetadata(new GetObjectMetadataRequest() 
       .WithBucketName(bucketName) 
       .WithKey(key)); 

      return true; 
     } 
     catch (Amazon.S3.AmazonS3Exception ex) 
     { 
      if (ex.StatusCode == System.Net.HttpStatusCode.NotFound) 
       return false; 

      //status wasn't not found, so throw the exception 
      throw; 
     } 
    } 

यह नहीं कर सकते हैं:

 public void CreateFolder(string bucketName, string folderName) 
    { 
     var folderKey = folderName + "/"; //end the folder name with "/" 

     var request = new PutObjectRequest(); 

     request.WithBucketName(bucketName); 

     request.StorageClass = S3StorageClass.Standard; 
     request.ServerSideEncryptionMethod = ServerSideEncryptionMethod.None; 

     //request.CannedACL = S3CannedACL.BucketOwnerFullControl; 

     request.WithKey(folderKey); 

     request.WithContentBody(string.Empty); 

     S3Response response = m_S3Client.PutObject(request); 

    } 

अब जब मैं अगर फ़ोल्डर इस कोड का उपयोग मौजूद है देखने की कोशिश फ़ोल्डर ढूंढें। अजीब चीज यह है कि अगर मैं एडब्ल्यूएस प्रबंधन कंसोल का उपयोग कर फ़ोल्डर बना देता हूं, तो 'IsFolderExist' विधि इसे देख सकती है।

मुझे यकीन नहीं है कि यह एक एसीएल/आईएएम चीज है लेकिन मुझे यकीन नहीं है कि इसे कैसे हल किया जाए।

उत्तर

10

आपका कोड वास्तव में मेरे लिए काम करता है, लेकिन कुछ चीजें हैं जिन्हें आपको अवगत कराने की आवश्यकता है।

जैसा कि मैं इसे समझता हूं, अमेज़ॅन एस 3 में फ़ोल्डर्स की अवधारणा नहीं है, लेकिन व्यक्तिगत ग्राहक एस 3 ऑब्जेक्ट्स को प्रदर्शित कर सकते हैं जैसे कि उन्होंने किया था। तो यदि आप ए/बी नामक ऑब्जेक्ट बनाते हैं, तो क्लाइंट इसे प्रदर्शित कर सकता है जैसे कि यह ए नामक फ़ोल्डर के अंदर बी नामक ऑब्जेक्ट था। यह सहज है और ऐसा लगता है कि एक मानक बन गया है, लेकिन एक खाली फ़ोल्डर सिमुलेट नहीं दिख रहा है एक मानक है।

उदाहरण के लिए, मैंने टेस्ट नामक फ़ोल्डर बनाने के लिए आपकी विधि का उपयोग किया, फिर वास्तव में टेस्ट/ऑब्जेक्ट नामक ऑब्जेक्ट बनाना समाप्त कर दिया। लेकिन मैं एक फ़ोल्डर एडब्ल्यूएस Explorer में Test2 कहा जाता है (दृश्य स्टूडियो के लिए ऐड-ऑन यानी) बनाया है और यह एक वस्तु बुलाया Test2/Test2_ $ फ़ोल्डर $ एक बार

(एडब्ल्यूएस एक्सप्लोरर फ़ोल्डर के रूप में दोनों टेस्ट और Test2 प्रदर्शित करेगा) बना दी चीजें हैं जो इसका मतलब यह है की है कि आप नहीं जरूरत 'फ़ोल्डर' बनाने के लिए इससे पहले कि आप उपयोग कर सकते हैं, मतलब यह हो सकता है कि आप एक DoesFolderExist विधि की जरूरत नहीं है क्या करते हैं।

मैं उल्लेख के रूप में मैं अपने कोड

DoesFolderExist("Test/"    , bucketName); // Returns true 
DoesFolderExist("Test2/"    , bucketName); // Returns false 
DoesFolderExist("Test2/Test2_$folder$", bucketName); // Returns true 

की कोशिश की और यह काम करता है और यह बनाया परीक्षण फ़ोल्डर पाता है, लेकिन कुंजी एडब्ल्यूएस एक्सप्लोरर के द्वारा बनाई गई फ़ोल्डर खोजने के लिए बदलाव किया जा सकता था, यानी तो अगर आप ऐसा करेंगे अभी भी एक DoesFolderExist विधि करना चाहते हैं, तो यह बस किसी भी ऑब्जेक्ट folderName साथ + "/" शुरू करते हैं, यानी की तरह कुछ

"छवियों की तरह कुछ
ListObjectsRequest request = new ListObjectsRequest(); 
request.BucketName = bucketName ; 
request.WithPrefix(folderName + "/"); 
request.MaxKeys = 1; 

using (ListObjectsResponse response = m_S3Client.ListObjects(request)) 
{ 
    return (response.S3Objects.Count > 0); 
} 
+0

उपयोगी जानकारी - धन्यवाद –

0
 ListObjectsRequest findFolderRequest = new ListObjectsRequest(); 
     findFolderRequest.BucketName = bucketName; 
     findFolderRequest.Prefix = path; 
     ListObjectsResponse findFolderResponse = s3Client.ListObjects(findFolderRequest); 
     Boolean folderExists = findFolderResponse.S3Objects.Any(); 

पथ हो सकता है देखने के लिए सुरक्षित हो सकता है/40/"। उपरोक्त कोड का उपयोग करते हुए देख सकते हैं कि एक तथाकथित फ़ोल्डर "छवियों/40 /" बाल्टी के नीचे मौजूद है या नहीं।

लेकिन अमेज़ॅन एस 3 डेटा मॉडल में फ़ोल्डर्स की अवधारणा नहीं है। आप एक चित्र को कॉपी या कुछ पथ के लिए दायर करने के लिए प्रयास करते हैं, इस सह बुलाया फ़ोल्डर मौजूद नहीं है, तो यह इस फ़ाइल या छवि का प्रमुख नाम के हिस्से के रूप में स्वचालित रूप बनाया जाएगा। इसलिए, आपको वास्तव में यह जांचने की आवश्यकता नहीं है कि यह फ़ोल्डर मौजूद है या नहीं।

docs.aws.amazon.com से बहुत महत्वपूर्ण जानकारी: अमेज़न S3 डाटा मॉडल एक फ्लैट संरचना है: आप एक बाल्टी बनाते हैं, और बाल्टी वस्तुओं संग्रहीत करता है। सबबकेट या उपफोल्डर्स का कोई पदानुक्रम नहीं है; हालांकि, आप तार्किक पदानुक्रम कुंजी नाम उपसर्गों और सीमांकक अमेज़न S3 सांत्वना करता है के रूप में उपयोग करते हुए यह निष्कर्ष निकाल सकते हैं।

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

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