尽管容器、路径和URI正确,Azure存储Blobs GetBlobs方法仍失败

xzlaal3s  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在使用Azure.Storage.Blobs 12.14版本...因为旧的SDK正在被弃用,我们的存储服务代码需要更新。
下面的代码与Microsoft文档教程匹配,失败但不会导致异常。它只是福尔斯到调用方,并导致“对象引用未设置为对象的示例"。
下面是一种方法(根据Guarav的建议进行了更新)

public async Task<List<EvaluationImage>> GetImagesFromVirtualFolder(CompanyDataDto? customer)
{
    var images = new List<EvaluationImage>();
    var imageFolderPrefix = $"publicfiles/images/{customer.AzureFolderName}/";
    var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
       ContainerSettings.MainAppContainer);

    try
    {
        await foreach (var blob in containerClient.GetBlobsAsync(prefix: imageFolderPrefix))
        {
            var filename = blob.Name;
            var img = new EvaluationImage
            {
                ImageUrl = $"{containerClient.Uri.AbsoluteUri}/{filename}",
                ImageCaption = GetCaptionFromFilename(filename),
                IsPosterImage = filename.Contains("poster"),
                ImagesForCompany = customer.CompanyName
            };
        }
    }
    catch (RequestFailedException ex)
    {
        Log.Logger.Error(ex.Message);
        throw;
    }

    return images;
}

当代码在foreach循环中时,它会在任何迭代完成之前退出,并由调用者(后面的razor页面代码)处理,然后在我迭代集合以构建图像标记的页面中发生错误。
该方法生成有效的容器

您可以将下面的url粘贴到浏览器中,它将被下载。https://enerteckchemical.blob.core.windows.net/enerteck/publicfiles/images/robsonpty/RobsonCivil_CatR475_CrawlerDozer.jpg
并且该容器中的图像是可检索的(它们是公共的)
one test image from the container
任何帮助都感激不尽。

rxztt3cl

rxztt3cl1#

请对您的代码进行2项更改:
1.更改以下代码行:

var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
        $"enerteck/publicfiles/images/{customer.AzureFolderName}/");

var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
        "enerteck");

因为你的blob容器的名字是enerteck,后面的都是blob前缀。
1.通过更改以下代码行将blob前缀添加到GetBlobsAsync调用:

await foreach (var blob in containerClient.GetBlobsAsync())

await foreach (var blob in containerClient.GetBlobsAsync(prefix: $"publicfiles/images/{customer.AzureFolderName}/"));

这样您就可以从名为publicfiles/images/{customer.AzureFolderName}的虚拟文件夹中获取blob。

    • 更新**

下面是我运行的代码,工作得很好:

var connectionString =
    "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key;EndpointSuffix=core.windows.net;";

var containerName = "enerteck";
var prefix = "publicfiles/images/robsonpty/";

var containerClient = new BlobContainerClient(connectionString,
    containerName);

await foreach (var blob in containerClient.GetBlobsAsync(prefix: prefix))
{
    Console.WriteLine(blob.Name);
}

相关问题