如何用C#上传文件至现有Blob存储指定虚拟目录?代码问题求助
问题分析与修正方案
核心错误点
- 容器名混淆:你误将虚拟目录路径
folder-a/folder-b当作容器名,容器名应是Blob存储中已存在的真实容器名称(比如my-data-container这类)。 - 错误创建容器:使用
CreateBlobContainer会尝试新建容器,但你明确说明容器已存在,此操作会触发"容器已存在"的异常,需改用GetBlobContainerClient获取现有容器实例。 - 虚拟目录未正确配置:Blob存储的虚拟目录是通过Blob名称的前缀实现的,上传时需将
folder-a/folder-b/拼接在文件名前,才能让文件落在指定虚拟路径下。
修正后的代码
static string connectionString = "your-connection-string"; // 替换为你已存在的容器实际名称 static string containerName = "your-existing-container"; // 目标虚拟目录路径,末尾加斜杠确保路径层级正确 static string targetVirtualPath = "folder-a/folder-b/"; static void Main(string[] args) { BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); // 获取现有容器,而非创建新容器 BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName); // 可选:提前验证容器是否存在,避免后续无意义操作 if (!containerClient.Exists()) { Console.WriteLine("指定容器不存在,请检查容器名称"); return; } var files = Directory.GetFiles(@"C:/root"); foreach (var file in files) { // 拼接虚拟目录与文件名,生成完整Blob路径 string blobName = targetVirtualPath + Path.GetFileName(file); using (MemoryStream stream = new MemoryStream(File.ReadAllBytes(file))) { containerClient.UploadBlob(blobName, stream); } Console.WriteLine($"{file} 已上传"); } Console.Read(); }
额外注意事项
- 确保连接字符串对应的账号拥有Blob存储的写入权限,避免因权限不足导致上传失败。
- 若上传大文件,建议改用异步方法
UploadAsync并开启分块上传,降低内存占用。 - Blob存储的虚拟目录无需提前创建,上传带前缀的Blob时会自动生成对应路径层级。
内容的提问来源于stack exchange,提问作者penchalaiah narakatla
相关产品推荐
相关产品推荐

