2013-01-10 32 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); 
}