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方法 } }
说明
- 递归遍历:
setRecursive(true)会让SDK返回容器内所有Blob,无论其名称包含多少虚拟路径分隔符(/),彻底解决层级遍历问题。 - Blob名称逻辑:Azure Blob的“文件夹”是通过Blob名称前缀模拟的,比如
folder1/folder2/file.json只是单个Blob的名称,递归遍历会直接返回这类Blob。 - 过滤适配:使用
str_ends_with(PHP 8.0+)可精准匹配.json后缀;低版本PHP可替换为substr($keyname, -5) === '.json'。
内容的提问来源于stack exchange,提问作者interactionsolutions
相关产品推荐
相关产品推荐

