当前位置: 首页 > 知识库问答 >
问题:

如何从CloudBbloDirectory中获取对BlockBlob对象的引用。列表博客?

史洛城
2023-03-14

我正在使用Microsoft Azure。NET客户端库与Azure云存储交互。我需要能够访问其元数据集合中每个blob的附加信息。我目前正在使用CloudBlobDirectory。方法获取我在blob名称中设计的目录结构的特定目录中的blob列表。ListBlobs()方法返回IListBlobItem对象的列表。它们只有几个属性:Url和对父目录和父容器的引用。我需要获得实际blob对象的元数据。

我设想有一种方法可以将IListBlobItem强制转换为BlockBlob对象,或者使用IListBlockItem获取对BlockBlob的引用,但似乎找不到这样做的方法。

我的问题是:有没有办法从这个方法中获取一个BlockBlob对象,或者我必须使用不同的方法来获取实际的BlockBlob对象?如果不同,那么你能建议一种方法来实现这一点,同时还能够通过“目录”方案进行过滤吗?

共有3个答案

何宏博
2023-03-14

前面的答案很好。我只想指出两件事:

1) 现在,Azure SDK也支持异步编程。所以试着使用它:

CloudBlobDirectory dir = container.GetDirectoryReference(dirPath);
var blobs = dir.ListBlobs(true);

foreach (IListBlobItem item in blobs)
{
    CloudBlockBlob blob = (CloudBlockBlob)item;
    await blob.FetchAttributesAsync(); //Use async calls...
}

2) 在单独调用中获取元数据效率不高。代码为每个blob对象发出2个HTTP请求。ListBlobs()方法通过设置BlobListingDetails参数,支持在一次调用中获取元数据:

CloudBlobDirectory dir = container.GetDirectoryReference(dirPath);
var blobs = dir.ListBlobs(useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Metadata);

我建议尽可能使用第二个代码。因为这是获取元数据最有效的方法。

公孙宇
2023-03-14

这种方法是为Java开发的,但我希望它能以某种方式被修改以适应任何其他受支持的语言。尽管您提出的功能尚未明确开发,但我想我找到了一种不同的(希望不那么笨拙的)方法来从ListBlowItem元素访问CloudBlockBlob数据

例如,可以使用以下代码删除特定目录中的每个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);
}
祁承望
2023-03-14

好啊我找到了一种方法来实现这一点,虽然它看起来有点笨拙和间接,但它确实实现了我认为应该可行的主要事情,即将IListBlobItem直接投射到CloudBlockBlob对象。

我正在做的是从Directory对象的ListBblos()方法中获取列表,然后循环遍历列表中的每个项目,并将该项目转换为CloudBlockBlob对象,然后调用Fetch属性()方法来检索属性(包括元数据)。然后将一个新的“info”对象添加到一个新的info对象列表中。这是我使用的代码:

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

整个“Blob”概念似乎不必要地复杂,而且似乎没有实现我所认为的Blob包装器的主要功能之一。也就是说,通过允许对名称、目录、容器和元数据进行查询来扩展搜索功能的一种方法。我认为您可以构建一个linq查询,其内容类似于:“返回‘images’容器中所有blob的列表,这些blob位于‘natural/landscales/’目录路径中,其元数据键为‘category’,值为‘sunset’”。似乎没有办法做到这一点,这对我来说似乎是一个错失的机会。哦,好吧。

如果我错了,大错特错,请告诉我。

 类似资料:
  • 我有一个对象列表(文件夹)。该列表中的每个对象A都有一个对象B(合作伙伴)列表,对象B也有一个对象C(人员)列表。对象C包含一个属性代码,我想用它来使用Java8进行过滤。 我试过下面的代码,但它似乎不工作: 你们知道我如何使用FlatMap从

  • 我想通过对象在Java中的属性来获取列表中对象的索引。 例: 现在,我想获取一个名为“Girish”的对象的索引。请务必让我知道JAVA中的代码。

  • 我正在尝试使用这些数据 https://api.nasa.gov/neo/rest/v1/neo/browse?api_key=demo_key 我成功地检索到了数据的“links”和“page”部分,但near_earth_objects数组为NULL。 我尝试了这篇文章中的建议: 使用Spring RestTemplate获取JSON对象列表 顶部答案给出错误: 下面是我的POJO的样子: 我

  • 假设数据采集对象如下所示 我需要尝试使用java lambda函数在引擎匹配时获取匹配的品牌对象。 现在,如果发动机类型匹配,我需要获得品牌名称。例如,如果搜索引擎1,则需要返回Honda对象。 下面是代码示例:类Vehicle: 类别品牌: 类车: 类引擎: 班级主修: 以上是我尝试的代码。之前,我的目标是使用授权子对象列表中的关键字进行过滤。 现在,我使用它作为一个键,以父对象或品牌对象作为值

  • 我是Javascript新手,我正试图从包含多个对象的数组中获取id键的值。 通过 for..在循环中,我需要对象的id - 如1,2或3 - 与不同的值进行比较。 我试着这样做: 但是,我这样做了,删除Id值返回未定义。 我想不通为什么返回未定义,我无法解决这个问题。 我希望我能很好地表达自己,对不起我的英语不好。

  • 问题内容: 当存在时,是否有可能获得全部列表?是否为此准备了电话,还是我必须编写一个foreach循环,如: 问题答案: Java 8及更高版本: 如果需要确保得到结果,则必须将最后一行更改为: Java 7及以下版本: Java 8之前的标准集合API不支持这种转换。您必须编写一个循环(或将其包装在您自己的“地图”函数中),除非您使用一些更高级的集合API /扩展。 (您的Java代码段中的行正