PHP自定义getExtension函数获取上传文件扩展名返回.file问题求解
解决建议
你当前贴出的代码首先存在语法错误:函数未补全结束的},先修正语法问题后,可按以下步骤排查修复:
// 补全基础错误且增加异常判断的函数示例 function getExtension($file){ // 优先判断上传是否成功,避免后续逻辑报错 if (!isset($_FILES[$file]) || $_FILES[$file]['error'] !== UPLOAD_ERR_OK) { return ''; } $fileName = $_FILES[$file]['name']; $extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); return $extension; }
- 检查前端上传表单是否添加了
enctype="multipart/form-data"属性,缺少该属性会导致文件上传时的参数解析异常,出现文件名后缀被改写的问题。 - 先直接打印
$_FILES[$file]['name']的原始值,确认客户端传递的文件名本身是否带有.pdf后缀,部分浏览器安全插件、自定义上传逻辑或者客户端安全软件可能会篡改原始文件名,将后缀替换为.file。 - 不要完全依赖客户端传递的文件名判断格式,可靠性和安全性更高的方式是读取文件本身的头信息判断真实格式,示例代码如下:
// 基于文件内容判断真实后缀 function getRealExtension($tmpFilePath) { $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($tmpFilePath); $mimeMap = [ 'application/pdf' => 'pdf', 'image/jpeg' => 'jpg', 'image/png' => 'png' // 可根据需求补充其他格式映射 ]; return $mimeMap[$mime] ?? ''; } // 调用示例:getRealExtension($_FILES[$file]['tmp_name']) - 检查PHP配置的
upload_tmp_dir临时目录读写权限是否正常,权限不足会导致上传文件解析异常,出现文件名读取错误。 - 排查项目中是否存在全局上传预处理逻辑、框架中间件改写了
$_FILES全局变量的内容,部分安全组件会默认将未知格式文件的后缀修改为.file避免安全风险。
内容的提问来源于stack exchange,提问作者António Miguel
相关产品推荐
相关产品推荐

