【问题标题】:Iterating through blobs in Azure SDK v12在 Azure SDK v12 中迭代 blob
【发布时间】:2021-10-05 09:49:45
【问题描述】:

我正在升级 Web 应用以使用 Azure SDK v 12.10

在此之前,我将虚拟路径中的所有 blob 从容器抓取到一个列表中并遍历它们。

var results = await blobContainer.
                ListBlobsSegmentedAsync("publicfiles/images/" + customer.AzureFolderName, true, BlobListingDetails.All, 100, blobContinuationToken, null, null);
            // Get the value of the continuation token returned by the listing call.
            blobContinuationToken = results.ContinuationToken;

            foreach (var item in results.Results)
            {
                var filename = GetFileNameFromBlobUri(item.Uri, customer.AzureFolderName);
                var img = new EvaluationImage
                {
                    ImageUrl = item.Uri.ToString(),
                    ImageCaption = GetCaptionFromFilename(filename),
                    IsPosterImage = filename.Contains("poster"),
                    ImagesForCompany = customer.CompanyName
                };

                images.Add(img);
            }

我可以通过谷歌搜索如何在新 SDK 中执行此操作,得到这个

await foreach (BlobItem blob in blobContainer.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"publicfiles/images/{customer.AzureFolderName}"))

问题是“blob”变量(BlobItem)具有最少的可用属性,例如,我需要以前可用的 Uri。先前版本中的“blob”变量具有许多可用属性。是否有其他类型(不是 BlobItem)具有我在搜索中找不到的这些属性?

我在 BlobTraits 或 BlobStates 中看不到任何可以改变这一点的东西。

【问题讨论】:

  • 你查看Metadata的内容了吗?
  • 您使用的是哪个 SDK 的确切名称和版本?我刚刚测试了 NuGet 包 Azure.Storage.Blobs(版本 12.8.0)+ .NET Core 3.1 控制台应用程序和方法 ListBlobsSegmentedAsync() 在您的代码以及 URI 属性中仍然可用。请仔细检查 NuGet 包和版本。
  • 元数据和属性具有任何需要的属性。我正在使用 Azure SDK v 12.10.0 beta 2 Azure.Storage.Blobs
  • Evandro...我使用的是 .Net 6 预览版,而不是 3.1,并且 BlobClient 上没有 ListBlobsSegmentedAsync 方法,这是 v12 中使用的方法,这是 CloudBobContainer 的 v11 方法

标签: c# azure azure-blob-storage


【解决方案1】:

在 SDK 版本 12.x 中获取 blob 的 URI 并不那么简单。当您在列表结果中获得 BlobItem 时,您需要从中创建一个 BlobClient 对象,然后您将能够获取 blob 的 URI。

这是执行此操作的示例代码:

BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(container);
var listingResult = containerClient.GetBlobsAsync();
await foreach (var blobItem in listingResult)
{
    BlobClient blobClient = containerClient.GetBlobClient(blobItem.Name);
    Uri blobUri = blobClient.Uri;
    //Do something with the URI...
}

上面的代码使用了Azure.Storage.Blobs (12.9.1) SDK。

【讨论】:

  • 我只需要文件名,现在我从 blob.Name 中得到它,但这很有帮助
猜你喜欢
  • 2021-01-04
  • 2020-06-28
  • 2021-03-31
  • 1970-01-01
  • 2020-11-25
  • 2022-01-27
  • 2021-11-24
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多