获取子文件夹 Azure 中的 blob 列表

Posted

技术标签:

【中文标题】获取子文件夹 Azure 中的 blob 列表【英文标题】:Get list of blobs in subfolder Azure 【发布时间】:2020-11-29 07:51:09 【问题描述】:

我正在使用 JS sdk 与 Azure 存储进行交互。

我的层次结构如下所示: 演示(容器名称) / ID // 文件列表

所以我试图获取特定子文件夹的文件列表。我假设使用 listBlobsByHierarchy 是要使用的,但我无法获取该特定文件夹的 blob 列表。

我的代码:

 for await (const item of containerClient.listBlobsByHierarchy("/")) 
        console.log(item, 'ITEM')
        if (item.kind === "prefix") 
          console.log(`\tBlobPrefix: $item.name`);
         else 
          console.log(`\tBlobItem: name - $item.name, last modified - $item.properties.lastModified`);
        
      

返回

     kind: 'prefix', name: '5f09b7ab047f9804a861672d/'  ITEM
    BlobPrefix: 5f09b7ab047f9804a861672d/
 kind: 'prefix', name: '5f300119536cc32ce44c0013/'  ITEM
    BlobPrefix: 5f300119536cc32ce44c0013/
 kind: 'prefix', name: 'test/'  ITEM
    BlobPrefix: test/

现在我想获取文件夹 5f09b7ab047f9804a861672d 中的文件列表,例如

【问题讨论】:

您还有其他顾虑吗? 【参考方案1】:

使用 azure node storage sdk,我们可以使用 te 方法 listBlobsFlatlistBlobsByHierarchy 列出 blob。这两种方法有一些区别。方法listBlobsFlat 可以列出所有的blob。方法listBlobsByHierarchy 只能列出***文件夹和blob,就像您在C:/下运行“dir”一样。另外,如果要列出子文件夹中的子blob,我们需要使用prefix

例如

我的容器结构如下

hello.txt
...
test
  test.txt
  test1
     data.json 

代码(列出文件夹 test 中的 blob)

const 
  BlobServiceClient,
  StorageSharedKeyCredential,
 = require("@azure/storage-blob");

// Enter your storage account name and shared key
const account = "jimtestdiag924";
const accountKey ="";

// Use StorageSharedKeyCredential with storage account and account key
// StorageSharedKeyCredential is only available in Node.js runtime, not in browsers
const sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);
const blobServiceClient = new BlobServiceClient(
  `https://$account.blob.core.windows.net`,
  sharedKeyCredential,
);
const containerName = "testupload";
async function listBlobs() 
  const containerClient = await blobServiceClient.getContainerClient(
    containerName,
  );
  console.log("list blobs with method listBlobsFlat");
  let iter = containerClient.listBlobsFlat( prefix: "test/" );
  for await (const item of iter) 
    console.log(`\tBlobItem: name - $item.name`);
  
  console.log("list blobs with method listBlobsByHierarchy");
  let iter1 = containerClient.listBlobsByHierarchy("/",  prefix: "test/" );
  for await (const item of iter1) 
    if (item.kind === "prefix") 
      console.log(`\tBlobPrefix: $item.name`);
      await listblob(containerClient, item.name);
     else 
      console.log(`\tBlobItem: name - $item.name`);
    
  


async function listblob(containerClient, prefix) 
  let iter1 = containerClient.listBlobsByHierarchy("/",  prefix: prefix );
  for await (const item of iter1) 
    if (item.kind === "prefix") 
      console.log(`\tBlobPrefix: $item.name`);
     else 
      console.log(`\tBlobItem: name - $item.name`);
    
  


listBlobs().catch((err) => 
  console.error("Error running sample:", err.message);
);

【讨论】:

如果对你有用,可以accept it as an answer吗?

以上是关于获取子文件夹 Azure 中的 blob 列表的主要内容,如果未能解决你的问题,请参考以下文章

获取容器中 Azure blob 文件的名称列表?

Azure Blob 存储从特定目录而不是容器获取文件列表

如何递归加载 Azure blob 文件列表?

子文件夹的 Azure 函数 blob 触发器

仅从 Azure 存储 [Azure-Blob][REST] 中的 Blob 列表获取特定元数据

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件