PHP判断文件后缀为空或不存在需分三步:先检查$_FILES['file']['error']是否为UPLOAD_ERR_NO_FILE以确认是否上传;再校验$_FILES'file'是否为空或纯空白;最后用pathinfo或strrpos安全提取extension,或用正则preg_match('/.1+$/u')验证有效后缀。.\s ↩

PHP中判断文件后缀为空或不存在,常出现在上传表单验证、文件解析或路径安全检查场景——比如用户未选择文件却提交表单,或传入一个不带扩展名的临时文件名(如/tmp/phpABC123),此时直接调用pathinfo($file, PATHINFO_EXTENSION)可能返回空字符串,但你无法据此断定是“无后缀”还是“根本没传文件”。
判断$_FILES中文件是否实际上传
第一步:检查$_FILES['file']['error']是否等于UPLOAD_ERR_NO_FILE。
这是最权威的依据,表示客户端根本没选任何文件,连临时文件都没生成。
若该值为0,则说明文件已上传,后续才需分析后缀;若为4,就不用再碰$_FILES['file']['name']了。
第二步:确认$_FILES['file']['name']是否为空字符串或仅含空白字符。
即使error为0,某些浏览器或伪造请求仍可能让name为空——这时pathinfo会返回空,但根源是非法输入,不是后缀缺失。
建议用trim($_FILES['file']['name']) === ''来过滤首尾空格干扰。
提取并判断后缀是否为空
方法一:用pathinfo()配合isset和empty双重校验
先用$pathInfo = pathinfo($_FILES['file']['name']);获取数组,再检查isset($pathInfo['extension']) && $pathInfo['extension'] !== ''。
注意:pathinfo对无点号的文件名(如"readme")不会设置extension键,所以仅用empty($pathInfo['extension'])会触发未定义索引警告。
立即学习“PHP免费学习笔记(深入)”;
方法二:用strrpos()定位最后一个点号位置
用$dotPos = strrpos($_FILES['file']['name'], '.');若$dotPos === false,说明无点号→无后缀;若$dotPos === 0,说明文件名以点开头(如".gitignore"),此时extension应取substr($_FILES['file']['name'], 1),但通常这种文件不被视为常规上传目标。
【关键前提】必须确保$_FILES['file']['name']已通过非空校验,否则strrpos会对null报Warning。
防御性写法:一行安全判断
将上述逻辑压缩为可直接使用的布尔表达式:
!empty($_FILES['file']['name']) && isset($_FILES['file']['error']) && $_FILES['file']['error'] === UPLOAD_ERR_OK && preg_match('/\.[^.\s]+$/u', $_FILES['file']['name']);
这个正则确保文件名末尾有至少一个非点、非空白字符组成的后缀段,同时规避了pathinfo在点开头或纯点名(如"."或"..")时的异常行为。



















