如何用PHP遍历扩展名,为远程服务器文件补全正确后缀?
这个需求其实挺常见的,用PHP完全可以搞定,我给你拆解下思路和具体实现代码:
核心思路
要给JSON里的文件名补上正确的扩展名,核心步骤其实很清晰:
- 先读取并解析原JSON文件,拿到所有需要处理的「文件名+存储路径」条目
- 定义好你要排查的扩展名列表(比如你提到的
.jpg、.png、.pdf、.doc这些) - 对每个条目,依次拼接「路径+文件名+扩展名」,检查这个组合对应的文件是否真的存在于服务器上
- 找到存在的那个扩展名后,更新该条目的信息
- 最后把更新后的所有条目重新编码成JSON,保存回文件
这里要注意两种场景:PHP运行在目标服务器上(可直接访问文件系统) 和 只能通过HTTP URL访问远程文件,两种场景的文件存在性检查方式不一样,我分别给你写示例代码。
代码实现
场景1:PHP可直接访问服务器文件系统(比如同服务器部署)
这种情况我们可以用PHP的文件系统函数直接检查文件是否存在,效率更高:
<?php // 1. 读取原JSON文件 $jsonFilePath = 'your_original_file.json'; $originalData = json_decode(file_get_contents($jsonFilePath), true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON文件解析失败,请检查格式'); } // 2. 定义需要排查的扩展名列表,按优先级排序(如果有重名文件,优先匹配前面的) $extensions = ['.jpg', '.png', '.pdf', '.doc', '.docx']; // 3. 遍历每个条目处理 foreach ($originalData as &$item) { // 假设JSON里的结构是 {"filename": "xxx", "storage_path": "/path/to/folder/"} $basePath = rtrim($item['storage_path'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; $fileName = $item['filename']; $foundExtension = null; // 逐个尝试扩展名 foreach ($extensions as $ext) { $fullFilePath = $basePath . $fileName . $ext; // 检查文件是否存在且是普通文件(不是目录) if (file_exists($fullFilePath) && is_file($fullFilePath)) { $foundExtension = $ext; break; // 找到第一个匹配的就停止 } } // 如果找到扩展名,更新条目 if ($foundExtension) { $item['full_filename'] = $fileName . $foundExtension; // 或者直接替换原filename字段:$item['filename'] = $fileName . $foundExtension; } else { // 处理找不到对应文件的情况,比如标记为缺失 $item['status'] = '文件不存在'; } } unset($item); // 释放引用 // 4. 保存更新后的JSON文件 $updatedJson = json_encode($originalData, JSON_PRETTY_PRINT); file_put_contents($jsonFilePath, $updatedJson); echo 'JSON文件更新完成!'; ?>
场景2:只能通过HTTP URL访问远程文件
如果PHP无法直接访问服务器文件系统,只能通过URL检查(比如目标服务器是外部站点),我们可以通过发送HEAD请求来判断文件是否存在(比GET请求更高效,不用下载整个文件):
<?php // 1. 读取原JSON文件 $jsonFilePath = 'your_original_file.json'; $originalData = json_decode(file_get_contents($jsonFilePath), true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON文件解析失败,请检查格式'); } // 2. 定义需要排查的扩展名列表 $extensions = ['.jpg', '.png', '.pdf', '.doc', '.docx']; // 3. 遍历每个条目处理 foreach ($originalData as &$item) { // 假设JSON里的结构是 {"filename": "xxx", "base_url": "http://www.somesite.com/"} $baseUrl = rtrim($item['base_url'], '/') . '/'; $fileName = $item['filename']; $foundExtension = null; foreach ($extensions as $ext) { $fullUrl = $baseUrl . $fileName . $ext; // 发送HEAD请求检查URL是否存在 $headers = get_headers($fullUrl, 1); if ($headers && strpos($headers[0], '200 OK') !== false) { $foundExtension = $ext; break; } } if ($foundExtension) { $item['full_filename'] = $fileName . $foundExtension; $item['full_url'] = $baseUrl . $fileName . $foundExtension; } else { $item['status'] = '对应URL不存在'; } } unset($item); // 4. 保存更新后的JSON $updatedJson = json_encode($originalData, JSON_PRETTY_PRINT); file_put_contents($jsonFilePath, $updatedJson); echo 'JSON文件更新完成!'; ?>
注意事项
- 扩展名优先级:如果同一个文件名对应多个扩展名的文件(比如
filename.jpg和filename.png都存在),代码里会匹配你扩展名列表里排在前面的那个,所以可以根据你的业务需求调整列表顺序。 - 性能优化:如果文件数量很多,建议分批处理,避免一次性占用过多资源;HTTP场景下可以考虑加请求间隔,防止被目标服务器限制。
- 错误处理:代码里加了基础的JSON解析错误处理,你还可以根据需要添加更多异常捕获(比如文件读写权限、网络请求失败等)。
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

