2013-01-10 28 views
11

我正在使用Microsoft Azure .NET客戶端庫與Azure雲存儲進行交互。我需要能夠訪問關於其元數據集合中每個blob的附加信息。我目前使用CloudBlobDirectory.ListBlobs()方法來獲取我在Blob名稱中設計的目錄結構的特定目錄中的blob列表。 ListBlobs()方法返回IListBlobItem對象的列表。它們只有幾個屬性:Url和對父目錄和父容器的引用。我需要到達實際的blob對象的元數據。如何從CloudBlobDirectory.ListBlobs獲取對BlockBlob對象的引用?

我設想有一種方法可以將IListBlobItem強制轉換爲BlockBlob對象,或者使用IListBlockItem來獲得對BlockBlob的引用,但似乎找不到這種方法。

我的問題是:有沒有辦法從這種方法獲取BlockBlob對象,或者我必須使用不同的方式獲取實際的BlockBlob對象?如果不同,那麼你可以提出一種方法來實現這一目標,同時也可以通過「目錄」方案進行過濾?

回答

11

好的......我找到了一種方法來做到這一點,雖然它看起來有些笨拙和間接,但它確實實現了我認爲應該可行的主要事情,即將IListBlobItem直接投射到CloudBlockBlob對象。

我在做的是從目錄對象的ListBlobs()方法獲取列表,然後遍歷列表中的每個項目並將項目轉換爲CloudBlockBlob對象,然後調用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"] 
    }); 
} 

整個「斑點」的概念似乎是不必要的複雜性似乎並沒有達到我有什麼想法本來的斑點包裝的主要特徵之一。也就是說,通過允許查詢名稱,目錄,容器和元數據來擴展搜索功能。我曾想過你可以構造一個linq查詢,它有點像這樣讀取:「返回'images'容器中所有blob的列表,這些列在'natural/landscapes /'目錄路徑中,元數據關鍵字爲'類別'的值爲'日落'「。似乎沒有辦法做到這一點,這似乎是錯過了我的機會。好吧。

如果我錯了,並在這裏基地,請讓我知道。

+0

我完全同意你的看法,微軟的設計是非常愚蠢的。我正在從MongoDB遷移,至少在MongoDB上我可以搜索元數據。我想使用元數據將blob標記爲具有某些有趣的屬性,然後使用這些屬性檢索所有blob。顯然,在沒有迭代每個blob或使用blob的名稱來存儲過濾器的情況下,這在Windows Azure中是不可能的。 – NathanAldenSr

2

此方法已針對Java開發,但我希望可以以某種方式對其進行修改以適應任何其他支持的編程語言。儘管您提出的功能尚未明確開發,但我認爲我發現了一種與ListBlobItem元素訪問數據不同的方法(希望不那麼笨拙)。

以下代碼可用於刪除,例如,具體的目錄內的每個blob。

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); 
}