如何从包含容器名称的Blob路径中读取

问题描述 投票:0回答:2

我有一个要求,我想读取 blob 并在 Sftp 位置上传。Blob 路径的格式为“/container/folder1/subfold1/abc.blob”。我使用下面的代码从上面读取 blob斑点路径

  BlobServiceClient blobServiceClient1 = new BlobServiceClient(connectionString);
  BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient(containerName);
            var bname = "container/folder1/subfold1/abc.blob";
            var blockBlobClient1 = containerClient1.GetBlockBlobClient(bname);
            using (var uploadBlobStream = blockBlobClient1 .OpenReadAsync())
            {
                _sftp.Connect();
                var blobPath = string.Format("{0}/{1}", remoteFilePath, "tst.txt");
                _sftp.UploadFile(uploadBlobStream.Result, remoteFilePath, true);
                _sftp.Disconnect();
            }

但是它会抛出 Blob 文件不存在的错误。任何人都可以帮忙解决这个问题吗?

c# azure cloud blob
2个回答
0
投票

您可以尝试以下更改:

您需要在路径中使用containerName 的值而不是“container”。

var bname = $"{containerName}/folder1/subfold1/abc.blob";

OpenReadAsync 方法返回一个代表异步操作的 Task 对象,而不是流本身。您需要等待任务才能获取流,如下所示:

using (var uploadBlobStream = await blockBlobClient1.OpenReadAsync())
{
    // ...
}

此外,值得注意的是,UploadFile 方法需要 Stream 对象作为其第一个参数,但您将 OpenReadAsync 返回的 Task 对象传递给它。您需要传递流本身,如下所示:

_sftp.UploadFile(uploadBlobStream, remoteFilePath, true);

如果您觉得有用,请点赞。谢谢:)


0
投票

这可能与您的前缀/结构有关。尝试这样的事情:

   public async Task<AsyncPageable<BlobItem>> GetBlobItems(string prefix)
   {
       var connectionString = "UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://127.0.0.1:10000/devstoreaccount1;";

       var blobServiceClient = new BlobServiceClient(connectionString);
       string containerName = "raw";
       var containerClient = blobServiceClient.GetBlobContainerClient(containerName);

       var blobs = containerClient.GetBlobsAsync(prefix: $"[replace-with-what-looks-like-containing-folder]/{prefix}");

       return blobs;        
   }

然后您可以对每个结果进行等待:

   var items = await _blobService.GetBlobItems("2024-01-02");

   await foreach (var item in items)
   {
       Console.WriteLine(item.Name);
   }

仅应将容器名称传递到“GetBlobContainerClient”方法中。您在浏览存储帐户时看到的任何后续文件夹结构都应与指定的前缀一起传递到“GetBlobsAsync”方法中。

© www.soinside.com 2019 - 2024. All rights reserved.