You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取含容器名的Blob路径并上传SFTP报错,请求技术协助

问题解决:Blob文件不存在错误修复

关键错误点

  1. Blob名称参数错误:
    你传入GetBlockBlobClient()的bname包含了容器名container,但该方法仅需要容器内的Blob相对路径。完整Blob路径/container/folder1/subfold1/abc.blob中,容器名是container,Blob的实际名称应为folder1/subfold1/abc.blob。

  2. 异步流处理不当:
    OpenReadAsync()返回的是Task<Stream>,你直接将Task对象放入using语句并调用.Result,这会导致资源管理异常,还可能触发异步死锁。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:18:09