Azure Blob Storage .NET SDK列举层级Blob报错与死循环问题求助
问题排查与修复方案
第一个扁平化列表方案错误原因
- 调用
GetBlobsAsync()已经可以拿到所有blob的完整路径(即blobItem.Name是类似{Guid}/images/{Guid}.jpg的全路径),不需要额外拼接images/前缀,拼接后路径完全错误 - 使用
Path.Combine拼接Blob路径会出现跨平台兼容问题:Windows环境下该方法会返回反斜杠分隔的路径,而Azure Blob仅支持正斜杠作为路径分隔符,格式错误直接触发System.FormatException
修复后的扁平化代码
var resultSegment = containerClient.GetBlobsAsync().AsPages(); await foreach(var blobPage in resultSegment) { foreach(var blobItem in blobPage.Values) { // 只处理images目录下的jpg文件,过滤不需要的blob if (!blobItem.Name.Contains("/images/") || !blobItem.Name.EndsWith(".jpg")) continue; using(var stream = new MemoryStream()) { // 直接用blobItem.Name作为路径,不需要额外拼接 var blobClient = containerClient.GetBlobClient(blobItem.Name); await blobClient.DownloadToAsync(stream); result.Add( new AzureBlobResponse { Data = stream.ToArray(), Filename = Path.GetFileName(blobItem.Name) // 如果你只需要文件名而不是全路径 }); } } }
第二个层级遍历方案死循环与错误原因
- 处理前缀时错误地将
/替换为空格:Blob的层级前缀必须保留/作为分隔符,替换后的前缀完全不符合实际存储结构,导致每次遍历都返回相同的无效结果,陷入死循环 - 初始调用传入的前缀
images不符合你的存储结构:你的images目录都在一级Guid目录下,根目录下不存在直接以images开头的blob,初始前缀应该传null或空字符串遍历根目录 - 同样存在拼接多余
images/前缀的问题,blobItem.Blob.Name已经是完整路径,不需要额外拼接
修复后的层级遍历代码
private async Task NavigateBlobHierarchy(List<AzureBlobResponse> result, string? prefix) { var resultSegment = containerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/") .AsPages(); await foreach(var blobPage in resultSegment) { foreach(var blobItem in blobPage.Values) { if(blobItem.IsPrefix) { // 直接传原前缀,不要替换/为空格 await NavigateBlobHierarchy(result, blobItem.Prefix); } else { // 过滤非jpg文件 if (!blobItem.Blob.Name.EndsWith(".jpg")) continue; using(var stream = new MemoryStream()) { // 直接用完整Blob名称,不需要拼接 var blobClient = containerClient.GetBlobClient(blobItem.Blob.Name); await blobClient.DownloadToAsync(stream); result.Add( new AzureBlobResponse { Data = stream.ToArray(), Filename = Path.GetFileName(blobItem.Blob.Name) }); } } } } }
修复后的调用方式
try { var listOfBlobs = new List<AzureBlobResponse>(); // 初始前缀传null遍历根目录 await NavigateBlobHierarchy(listOfBlobs, null); return listOfBlobs; } catch (Exception e) { throw; }
内容的提问来源于stack exchange,提问作者SomeStudent
相关产品推荐
相关产品推荐

