【问题标题】:GetBlockBlobReference not giving the folder path detailsGetBlockBlobReference 未提供文件夹路径详细信息
【发布时间】:2019-01-21 13:47:57
【问题描述】:

我正在尝试从 Azure 存储资源管理器下载块 Blob。我能够下载容器根目录中存在的所有块 blob。我无法下载嵌套在容器内的子文件夹中的 blob

        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);

        SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();            
        sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(1);
        sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

        string sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

        return blob.Uri.AbsoluteUri + sasBlobToken;

【问题讨论】:

  • 我不确定你的意思。 Blob 存储没有子文件夹的概念。只有虚拟文件夹。你能更好地描述你想要达到的目标吗?发布的代码显示了如何下载单个 blob。
  • 子文件夹是指文件夹内的文件夹。我在容器中创建了多个文件夹。
  • 您要下载虚拟文件夹中的所有 Blob,还是下载虚拟文件夹中的单个 Blob?
  • 文件夹仅在您有文件时才存在(因为文件夹实际上只是文件名的一部分)。里面有文件吗?

标签: azure azure-storage azure-blob-storage


【解决方案1】:

我无法使用 GetBlockBlobReference(fileName) 获取 blockBlob 的绝对路径。下面的代码解决了我的问题。我得到了清单,然后使用 LINQ 来获取带有绝对路径详细信息的 blockBlob。 This post helped as well

        do
        {
            var listingResult = await blobDirectory.ListBlobsSegmentedAsync(useFlatBlobListing, blobListingDetails, maxBlobsPerRequest, continuationToken, null, null);


           //The below lined fetched the blockBlob with the correct directory details.
            var blockBlob = listingResult.Results.Where(x => x.Uri.AbsolutePath.Contains(fileName)).Count()>0 ? (CloudBlockBlob)listingResult.Results.Where(x=>x.Uri.AbsolutePath.Contains(fileName)).FirstOrDefault():null;

            if (blockBlob != null)
            {                    
                sasConstraints.SharedAccessExpiryTime = expiryTimeSAS;
                sasConstraints.Permissions = SharedAccessBlobPermissions.Read;                    
                string sasBlobToken = blockBlob.GetSharedAccessSignature(sasConstraints);                    
                return blockBlob.Uri.AbsoluteUri + sasBlobToken;                    
            }                
            continuationToken = listingResult.ContinuationToken;                

        } while (continuationToken != null);

如果有任何其他有效的方法可以从容器中的目录列表中提取 blob 信息,请纠正我。

【讨论】:

    【解决方案2】:

    以下解决方案有助于访问位于目录(或文件夹路径)下的单个文件绝对路径。

    public static String GetBlobUri(string dirPath, string fileName)
          {
               //Get a reference to a blob within the container.
             CloudStorageAccount storageAccount = CloudStorageAccount.Parse("Blob Key");
              CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
              CloudBlobContainer container = blobClient.GetContainerReference("Blob Container");
              CloudBlockBlob blockBlob = container.GetBlockBlobReference(dirPath+fileName);
    
            return blockBlob.Uri.AbsoluteUri;
        }
    

    希望这有助于尝试基于多级目录(Level1/Level2/Level3)路径访问 Blob 文件路径的人。

    【讨论】:

      【解决方案3】:

      只需使用 Gaurav Mantri 的 answer 中提到的 ListBlobs 即可检索所需子文件夹中的所有文件(blob)。然后遍历它并下载它:

      var storageAccount = CloudStorageAccount.Parse("yourConnectionString");
      var client = storageAccount.CreateCloudBlobClient();
      var container = client.GetContainerReference("yourContainer");
      var blobs = container.ListBlobs(prefix: "subdirectory1/subdirectory2", useFlatBlobListing: true);
      foreach (var blob in blobs) 
      {
          blob.DownloadToFileAsync("yourFilePath");
      }
      

      【讨论】:

        猜你喜欢
        • 2016-12-07
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 2020-11-16
        相关资源
        最近更新 更多