读取含容器名的Blob路径并上传SFTP报错,请求技术协助
问题解决:Blob文件不存在错误修复
关键错误点
Blob名称参数错误:
你传入GetBlockBlobClient()的bname包含了容器名container,但该方法仅需要容器内的Blob相对路径。完整Blob路径/container/folder1/subfold1/abc.blob中,容器名是container,Blob的实际名称应为folder1/subfold1/abc.blob。异步流处理不当:
OpenReadAsync()返回的是Task<Stream>,你直接将Task对象放入using语句并调用.Result,这会导致资源管理异常,还可能触发异步死锁。SFTP路径参数误用:
你定义了blobPath但上传时传入的是remoteFilePath,导致文件可能被上传到错误的目录。
修正代码
// 从完整Blob路径中提取容器名和Blob相对路径 var fullBlobPath = "/container/folder1/subfold1/abc.blob"; var pathSegments = fullBlobPath.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); var containerName = pathSegments[0]; var blobName = string.Join("/", pathSegments.Skip(1)); BlobServiceClient blobServiceClient1 = new BlobServiceClient(connectionString); BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient(containerName); var blockBlobClient1 = containerClient1.GetBlockBlobClient(blobName); // 先验证Blob是否存在 if (await blockBlobClient1.ExistsAsync()) { using (var blobStream = await blockBlobClient1.OpenReadAsync()) { _sftp.Connect(); var remoteFullPath = $"{remoteFilePath}/tst.txt"; _sftp.UploadFile(blobStream, remoteFullPath, true); _sftp.Disconnect(); } } else { throw new InvalidOperationException($"Blob {blobName} 在容器 {containerName} 中不存在"); }
注意事项
- 用
await替代.Result处理异步方法,避免异步上下文死锁问题。 - 读取Blob前调用
ExistsAsync()提前验证存在性,可更友好地处理异常场景。 - 确保存储账户连接字符串
connectionString配置正确,且目标容器已在存储账户中创建。
内容的提问来源于stack exchange,提问作者vmb
相关产品推荐
相关产品推荐

