在PHP开发文件上传功能时,我们需要从$_FILES全局数组中提取上传文件的原始名称和对应的后缀,这是后续进行文件存储、类型校验等操作的必要前提。

$_FILES数组的基本结构
当客户端通过表单上传文件时,PHP会将文件相关信息自动存入$_FILES全局数组,该数组的每个上传文件项默认包含以下核心字段:
- name:上传文件的原始名称,包含完整的文件名和后缀
- type:文件的MIME类型
- tmp_name:文件上传到服务器后的临时存储路径
- error:上传错误码,0表示上传成功
- size:文件的大小,单位为字节
我们需要获取的原始名称和后缀,就存储在$_FILES['上传字段名']['name']这个字段中。
pathinfo函数的作用与参数
pathinfo是PHP内置的用于解析文件路径信息的函数,它可以接收一个文件路径字符串,返回一个包含路径各组成部分的数组,也可以指定第二个参数返回特定的路径部分。函数的基本语法如下:
<?php // 完整返回所有路径信息 $info = pathinfo($path); // 返回指定部分,可选值:PATHINFO_DIRNAME、PATHINFO_BASENAME、PATHINFO_EXTENSION、PATHINFO_FILENAME $part = pathinfo($path, $option); ?>
其中和上传文件相关的两个返回部分是:
- PATHINFO_FILENAME:返回文件的名称,不包含后缀
- PATHINFO_EXTENSION:返回文件的后缀,不包含点号
完整实现示例
假设前端表单的上传文件字段名为upload_file,我们可以通过以下代码获取上传文件的原始名称和后缀:
<?php
// 判断是否有文件上传
if (isset($_FILES['upload_file']) && $_FILES['upload_file']['error'] === 0) {
// 获取上传文件的原始完整名称
$originalName = $_FILES['upload_file']['name'];
// 使用pathinfo解析原始名称
$fileInfo = pathinfo($originalName);
// 获取文件名称(不含后缀)
$fileName = $fileInfo['filename'];
// 获取文件后缀
$fileExt = $fileInfo['extension'] ?? '';
// 也可以直接指定参数获取对应部分
$directExt = pathinfo($originalName, PATHINFO_EXTENSION);
$directName = pathinfo($originalName, PATHINFO_FILENAME);
echo "原始完整名称:{$originalName}<br>";
echo "文件名称(不含后缀):{$fileName}<br>";
echo "文件后缀:{$fileExt}<br>";
echo "直接获取后缀:{$directExt}<br>";
echo "直接获取名称:{$directName}<br>";
} else {
echo "没有上传文件或上传失败";
}
?>
常见问题与注意事项
1. 后缀大小写问题
pathinfo获取的后缀会保留原始的大小写,比如上传的文件名为Test.PNG,获取到的后缀是PNG,如果需要统一后缀格式,可以通过strtolower函数转换为小写:
<?php $ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION)); ?>
2. 无后缀文件的处理
如果上传的文件没有后缀,pathinfo的extension键可能不存在,因此建议使用空合并运算符??设置默认值,避免出现未定义索引的错误。
3. 特殊文件名处理
如果上传的文件名包含多个点号,比如test.1.2.jpg,pathinfo会正确将最后一个点号后的内容作为后缀,也就是jpg,符合常规的文件后缀解析逻辑。
4. 安全校验建议
不要完全信任前端传递的文件后缀,建议结合mime_content_type函数校验文件的真实类型,避免恶意用户伪造后缀上传危险文件。