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

PHP中file_exists、filemtime函数失效问题求助(路径可正常访问)

解决PHP文件路径转码后无法识别的问题

核心问题出在转码后的路径变量包含隐藏的不可见字符,导致file_exists、filemtime等文件系统函数无法正确解析,而浏览器和手动输入路径不受这些字符影响。

排查与解决步骤:

  1. 清理路径中的无效字符
    转码后的路径可能携带UTF-16转码残留的BOM、CSV行尾的换行符(\r\n)、制表符或全角空格,这些肉眼不可见但会干扰路径识别。执行以下清理操作:

    $encoded_path = mb_convert_encoding($array[$i], 'UTF-8', 'UTF-16');
    // 移除首尾空白(含换行、制表符)
    $clean_path = trim($encoded_path);
    // 过滤所有非打印控制字符
    $clean_path = preg_replace('/[\x00-\x1F\x7F]/u', '', $clean_path);
    // 替换全角空格为半角空格
    $clean_path = str_replace(' ', ' ', $clean_path);
    
  2. 生成标准绝对路径
    用系统常量拼接路径,避免相对路径或手动拼接的错误:

    // 确保路径开头没有多余的斜杠,用DIRECTORY_SEPARATOR适配Windows/Linux
    $full_path = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . ltrim($clean_path, '/\\');
    
  3. 验证与调试
    如果仍有问题,输出路径的十六进制编码对比手动输入的正确路径,定位差异:

    if (file_exists($full_path)) {
        echo "Content last changed: " . date("F d Y H:i:s.", filemtime($full_path));
    } else {
        echo "调试信息:<br>";
        echo "处理后路径:" . htmlspecialchars($full_path) . "<br>";
        echo "路径十六进制:" . bin2hex($full_path) . "<br>";
        echo "预期正确路径十六进制:" . bin2hex("c:/xampp/htdocs/web/files/directory1/my file.pdf");
    }
    
  4. 确认转码准确性
    若UTF-16转码仍有问题,尝试指定UTF-16的字节序(LE/BE):

    $encoded_path = mb_convert_encoding($array[$i], 'UTF-8', 'UTF-16LE');
    // 或自动检测编码
    $encoded_path = mb_convert_encoding($array[$i], 'UTF-8', mb_detect_encoding($array[$i], ['UTF-16LE', 'UTF-16BE', 'UTF-8']));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:42:38