如何在Azure Blob容器中访问虚拟目录并下载子文件夹内文件?
解决Azure C#函数下载Blob容器子文件夹文件报错的问题
问题分析
根目录文件可正常下载,但子文件夹内文件报错,核心原因是Blob名称的路径解析或编码处理不当——Azure Blob存储没有物理文件夹,所谓“子文件夹”是Blob名称包含/分隔符的逻辑路径,若BlobUriBuilder解析出的BlobName存在编码异常(比如%2F未转义为/),就会导致找不到目标Blob。
修复步骤
确保Blob名称正确解码
修改BlobName的获取逻辑,对解析后的名称进行URL解码,处理转义字符:BlobUriBuilder blobUriBuilder = new BlobUriBuilder(fileUri); string containerName = blobUriBuilder.BlobContainerName; // 对Blob名称进行URL解码,将%2F转为/ string blobName = System.Web.HttpUtility.UrlDecode(blobUriBuilder.BlobName); BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName); BlobClient blobClient = containerClient.GetBlobClient(blobName); if (!await blobClient.ExistsAsync()) { return new NotFoundObjectResult(new { error = "验证文件名", details = "无法在指定位置找到文件" }); } BlobDownloadInfo download = await blobClient.DownloadAsync();直接使用Uri构造BlobClient(备选方案)
若路径解析仍有问题,可跳过BlobUriBuilder,直接用完整fileUri构造BlobClient,避免解析错误:// 使用身份凭证构造 BlobClient blobClient = new BlobClient(new Uri(fileUri), new DefaultAzureCredential()); // 或使用连接字符串构造(需提前获取containerName和正确的blobName) // BlobClient blobClient = new BlobClient(connectionString, containerName, blobName); if (!await blobClient.ExistsAsync()) { return new NotFoundObjectResult(new { error = "验证文件名", details = "无法在指定位置找到文件" }); } BlobDownloadInfo download = await blobClient.DownloadAsync();校验传入的fileUri格式
确认fileUri格式正确,示例格式如下:https://<存储账户名>.blob.core.windows.net/<容器名>/子文件夹1/子文件夹2/目标文件.txt
关键注意点
- Azure Blob存储中不存在实体文件夹,所有“子文件夹”路径都是Blob名称的一部分,比如
子文件夹1/子文件夹2/目标文件.txt是完整的Blob名称。 - 若使用SAS Token访问,需确保Token包含读取(
r)权限,且未过期。
内容的提问来源于stack exchange,提问作者Tilak Karthik
相关产品推荐
相关产品推荐

