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

Azure PHP SDK如何列出Blob容器中所有层级的.json文件?

解决Azure Blob存储遍历所有层级.json文件的问题

你的核心问题是默认listBlobs调用仅返回根路径的Blob,要遍历所有虚拟层级的Blob,需开启递归遍历选项。以下是修正后的实现方案:

关键修正点

  • 配置ListBlobsOptions开启递归遍历,确保获取所有层级的Blob(无视虚拟文件夹结构)
  • 修正代码中的变量名混用问题
  • 准确过滤带.json后缀的Blob(可按需调整为特定文件名如meta-data.json)

修正后的代码

$containerName = 'calls';

// 初始化选项并开启递归遍历
$listBlobsOptions = new \MicrosoftAzure\Storage\Blob\Models\ListBlobsOptions();
$listBlobsOptions->setRecursive(true); // 核心:开启递归获取所有层级Blob

// 获取容器内全部Blob
$results = $blobClient->listBlobs($containerName, $listBlobsOptions);

$count = 0;
foreach ($results->getBlobs() as $blob) { // 旧版SDK需通过getBlobs()获取Blob列表
    $keyname = $blob->getName(); // 获取包含完整虚拟路径的Blob名称
    echo "\nKey name is " . $keyname;

    // 过滤所有.json后缀文件,若需特定文件名可改为strpos($keyname, 'meta-data.json') !== false
    if (str_ends_with($keyname, '.json')) {
        $count++;
        echo "\nCount: " . $count;
        
        // 后续获取Blob内容的逻辑可在此扩展,当前先解决遍历问题
        // 注意:直接用$keyname无法通过file_get_contents访问,需生成SAS URL或使用SDK的getBlob方法
    }
}

说明

  1. 递归遍历:setRecursive(true)会让SDK返回容器内所有Blob,无论其名称包含多少虚拟路径分隔符(/),彻底解决层级遍历问题。
  2. Blob名称逻辑:Azure Blob的“文件夹”是通过Blob名称前缀模拟的,比如folder1/folder2/file.json只是单个Blob的名称,递归遍历会直接返回这类Blob。
  3. 过滤适配:使用str_ends_with(PHP 8.0+)可精准匹配.json后缀;低版本PHP可替换为substr($keyname, -5) === '.json'。

内容的提问来源于stack exchange,提问作者interactionsolutions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:45:28