为此,我使用 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 页面代码后面),然后错误发生在我迭代集合以构建图像标签的页面中。
该方法生成一个有效的容器
您可以将下面的网址粘贴到浏览器中,它就会下载。 //https://enerteckchemical.blob.core.windows.net/enerteck/publicfiles/images/robsonpty/RobsonCivil_CatR475_CrawlerDozer.jpg
并且该容器中的图像是可检索的(它们是公共(public)的)
one test image from the container
感谢任何帮助。
最佳答案
请对您的代码进行 2 处更改:
- 更改以下代码行:
var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
$"enerteck/publicfiles/images/{customer.AzureFolderName}/");
至
var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
"enerteck");
因为您的 Blob 容器的名称是 enerteck
。之后的所有内容都是 blob 前缀。
- 通过更改以下代码行将 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);
}
关于c# - 尽管容器、路径和 uri 正确,Azure 存储 Blob GetBlobs 方法仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75539796/