PHP中file_exists、filemtime函数失效问题求助(路径可正常访问)
解决PHP文件路径转码后无法识别的问题
核心问题出在转码后的路径变量包含隐藏的不可见字符,导致file_exists、filemtime等文件系统函数无法正确解析,而浏览器和手动输入路径不受这些字符影响。
排查与解决步骤:
清理路径中的无效字符
转码后的路径可能携带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);生成标准绝对路径
用系统常量拼接路径,避免相对路径或手动拼接的错误:// 确保路径开头没有多余的斜杠,用DIRECTORY_SEPARATOR适配Windows/Linux $full_path = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . ltrim($clean_path, '/\\');验证与调试
如果仍有问题,输出路径的十六进制编码对比手动输入的正确路径,定位差异: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"); }确认转码准确性
若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
相关产品推荐
相关产品推荐

