2013-01-10 4 views
11

मैं Azure क्लाउड स्टोरेज के साथ संवाद करने के लिए Microsoft Azure .NET क्लाइंट लाइब्रेरी का उपयोग कर रहा हूं। मुझे अपने मेटाडेटा संग्रह में प्रत्येक ब्लॉब के बारे में अतिरिक्त जानकारी तक पहुंचने में सक्षम होना चाहिए। मैं वर्तमान में क्लाउडब्लॉब डायरेक्टरी। लिस्टब्लॉब्स() विधि का उपयोग कर रहा हूं ताकि ब्लॉब्स नामों में एक निर्देशिका संरचना की एक विशेष निर्देशिका में ब्लॉब्स की एक सूची प्राप्त हो सके। ListBlobs() विधि IListBlobItem ऑब्जेक्ट्स की एक सूची देता है। उनके पास केवल कुछ गुण हैं: यूआरएल और मूल निर्देशिका और अभिभावक कंटेनर के संदर्भ। मुझे वास्तविक ब्लॉब ऑब्जेक्ट्स के मेटाडेटा पर जाना होगा।क्लाउडब्लॉब डायरेक्टरी.लिस्टब्लॉब्स से ब्लॉकब्लॉब ऑब्जेक्ट्स के संदर्भ कैसे प्राप्त कर सकते हैं?

मुझे कल्पना है कि ILBBobobtem को ब्लॉकब्लोब ऑब्जेक्ट में डालने का कोई तरीका होगा या ब्लॉकब्लॉब का संदर्भ प्राप्त करने के लिए IListBlockItem का उपयोग करें, लेकिन ऐसा करने का कोई तरीका नहीं दिख रहा है।

मेरा प्रश्न है: क्या इस विधि से ब्लॉकब्लोब ऑब्जेक्ट प्राप्त करने का कोई तरीका है, या क्या मुझे वास्तविक ब्लॉकब्लोब ऑब्जेक्ट प्राप्त करने का एक अलग तरीका उपयोग करना है? यदि अलग है, तो क्या आप इसे "निर्देशिका" योजना द्वारा फ़िल्टर करने में सक्षम होने के दौरान, इसे प्राप्त करने का एक तरीका सुझा सकते हैं?

उत्तर

11

ठीक है ... मैं यह करने के लिए एक रास्ता मिल गया है, और जब यह एक छोटे भद्दा और अप्रत्यक्ष लगता है, यह मुख्य बात मैंने सोचा था कि संभव है, जो एक CloudBlockBlob वस्तु को सीधे IListBlobItem कास्ट करने के लिए है होना चाहिए प्राप्त करता है।

मैं जो कर रहा हूं वह निर्देशिका ऑब्जेक्ट की ListBlobs() विधि से सूची प्राप्त कर रहा है और फिर सूची में प्रत्येक आइटम पर लूपिंग कर रहा है और आइटम को क्लाउडब्लॉकब्लॉब ऑब्जेक्ट पर कास्ट कर रहा है और फिर गुणों को पुनर्प्राप्त करने के लिए FetchAttributes() विधि को कॉल कर रहा है (मेटाडेटा सहित)। फिर जानकारी वस्तुओं की एक नई सूची में एक नई "जानकारी" वस्तु जोड़ें।

CloudBlobDirectory dir = container.GetDirectoryReference(dirPath); 

var blobs = dir.ListBlobs(true); 

foreach (IListBlobItem item in blobs) 
{ 
    CloudBlockBlob blob = (CloudBlockBlob)item; 
    blob.FetchAttributes(); 
    files.Add(new ImageInfo 
    { 
     FileUrl = item.Uri.ToString(), 
     FileName = item.Uri.PathAndQuery.Replace(restaurantId.ToString().PadLeft(3, '0') + "/", ""), 
     ImageName = blob.Metadata["Name"] 
    }); 
} 

पूरी "ब्लॉब" अवधारणा बेकार में जटिल लगता है और प्राप्त करने के लिए मैं क्या होगा सोचा ब्लॉब आवरण की मुख्य विशेषताओं में से एक हो गया होता प्रतीत नहीं होता: यहाँ कोड मैं का उपयोग कर रहा है। यही है, नाम, निर्देशिका, कंटेनर और मेटाडेटा पर एक क्वेरी की अनुमति देकर खोज क्षमताओं का विस्तार करने का एक तरीका है। मैंने सोचा होगा कि आप एक लिनक क्वेरी तैयार कर सकते हैं जो कुछ हद तक पढ़ेगा: "'छवियों' कंटेनर में सभी ब्लॉब्स की एक सूची लौटाएं, जो कि 'प्राकृतिक/परिदृश्य /' निर्देशिका पथ में हैं, जिनमें मेटाडेटा कुंजी है ' 'सूर्यास्त' के मूल्य के साथ श्रेणी '। ऐसा करने का कोई तरीका प्रतीत नहीं होता है और ऐसा लगता है कि यह मेरे लिए एक मौका अवसर है। ओह अच्छा।

यदि मैं गलत हूं और यहां आधार से बाहर हूं, तो कृपया मुझे बताएं।

+0

मैं पूरी तरह से आपसे सहमत हूं कि माइक्रोसॉफ्ट का डिजाइन पूरी तरह से मूर्ख है। मैं मोंगोडीबी से प्रवास कर रहा हूं और कम से कम मोंगोडीबी के साथ मैं मेटाडेटा पर खोज कर सकता हूं। मैं कुछ दिलचस्प गुणों के रूप में फ्लैग ब्लॉब्स के लिए मेटाडेटा का उपयोग करना चाहता हूं, फिर बाद में उन गुणों के साथ सभी ब्लॉब्स पुनर्प्राप्त करें। स्पष्ट रूप से यह विंडोज़ एज़ूर में प्रत्येक ब्लॉब को फिर से चलाने या फिल्टर स्टोर करने के लिए ब्लॉब के नाम का उपयोग किए बिना असंभव है। – NathanAldenSr

2

यह दृष्टिकोण जावा के लिए विकसित किया गया है, लेकिन मुझे उम्मीद है कि इसे किसी भी अन्य समर्थित प्रोग्रामिंग भाषा में फिट करने के लिए संशोधित किया जा सकता है। आपके द्वारा पूछे जाने वाले कार्यक्षमता के बावजूद अभी तक स्पष्ट रूप से विकसित नहीं किया गया है, मुझे लगता है कि ListBlobItem तत्व से CloudBlockBlob डेटा तक पहुंचने के लिए मुझे एक अलग (उम्मीदवार कम क्लंकी) तरीका मिला।

निम्नलिखित कोड को हटाने के लिए उपयोग किया जा सकता है, उदाहरण के लिए, एक ठोस निर्देशिका के अंदर प्रत्येक ब्लॉब।

String blobUri; 
CloudBlobClient blobClient = /* Obtain your blob client */ 

try{ 
    CloudBlobContainer container = /* Obtain your blob container */ 

    for (ListBlobItem blobItem : container.listBlobs(blobPrefix)) { 

      if (blobItem instanceof CloudBlob) { 
       blob = (CloudBlob) blobItem; 
       if (blob.exists()){ 
        System.out.println("Deleting blob " + blob.getName()); 
        blob.delete(); 
       } 
      } 
    } 
}catch (URISyntaxException | StorageException ex){ 
     Logger.getLogger(BlobOperations.class.getName()).log(Level.SEVERE, null, ex); 
} 
संबंधित मुद्दे

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