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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:27:33