PHP文件上传需HTML表单设method="post"和enctype="multipart/form-data",后端用$_FILES校验error值为0、is_uploaded_file()验证来源,并限制大小、类型及安全保存。

PHP实现文件上传功能主要依赖HTML表单配合$_FILES超全局数组,关键在于正确配置表单、服务端校验与安全保存。下面分步骤说明核心要点。
1. 前端表单必须设置正确属性
HTML表单需满足两个硬性要求:method必须为POST,且enctype必须设为multipart/form-data。否则$_FILES将为空。
示例代码:
2. 后端接收并校验上传文件
PHP通过$_FILES['avatar']获取上传信息,它是一个关联数组,包含name、tmp_name、size、type、error五个键。务必先检查error值是否为0(UPLOAD_ERR_OK),再进行其他判断。
立即学习“PHP免费学习笔记(深入)”;
常见校验建议包括:
- 检查
$_FILES['avatar']['error'] === UPLOAD_ERR_OK - 用
is_uploaded_file()确认文件来自HTTP上传(防伪造路径) - 限制文件大小(如
$_FILES['avatar']['size'] 表示2MB) - 验证文件扩展名和MIME类型(注意:
type字段可被客户端伪造,需结合finfo_file()二次校验)
3. 安全地移动并保存文件
上传的文件初始存于临时目录,必须用move_uploaded_file()将其移出,不能用copy()或rename()。目标路径需避免路径遍历(如过滤../)、禁止执行权限,并建议使用随机文件名防止覆盖与猜测。
示例片段:
$uploadDir = 'uploads/';$ext = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
$newName = uniqid() . '.' . strtolower($ext);
$targetPath = $uploadDir . $newName;
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $targetPath)) {
echo "上传成功,保存为:$newName";
} else {
echo "保存失败,请检查目录权限";
}
4. 补充注意事项
PHP配置影响上传行为,需确认php.ini中以下选项合理:
-
file_uploads = On(启用上传) -
upload_max_filesize = 8M(单文件上限) -
post_max_size = 8M(POST总数据上限,应≥upload_max_filesize) -
max_execution_time和max_input_time(大文件上传时避免超时)
生产环境还应考虑:上传目录不在Web根目录下、加访问控制、记录日志、支持多文件上传(<input type="file" name="files[]" multiple>)等。



















