PHP 文件上传总失败?从 $_FILES、大小限制到 move_uploaded_file() 一次排清

落伟姑娘_6566

落伟姑娘_6566

2026-06-09

637人浏览

转载

PHP 文件上传排查,别一上来就怀疑代码写错

文件上传失败,很多时候不是业务代码的问题,而是请求入口、大小限制、临时文件或落盘路径其中一环没接住。
浏览器表单
→ multipart 请求
→ PHP 临时文件
→ 校验文件
→ move_uploaded_file() 落盘

我遇到最多的是头像上传:本地能传,线上传不上;小图能传,大图报错;看起来是图片,结果混进了脚本文件。处理这类问题,不要只盯着 move_uploaded_file(),要从 $_files 进入服务端那一刻开始看。


一、$_FILES 为空,先查 enctype 和字段名

PHP 文件上传总失败?从 $_FILES、大小限制到 move_uploaded_file() 一次排清 - php中文网

后端拿不到文件时,先别急着改 PHP。页面表单如果没有 enctype="multipart/form-data",浏览器不会按文件上传的方式提交,服务端的 $_FILES 就可能是空的。


  

• 表单字段名是 avatar,后端就读 $_FILES['avatar']。

• 调试时先打印 $_FILES['avatar']['error'],别只看 tmp_name。

• 前端用异步上传时,确认 FormData 里真的追加了文件对象。

入口没进来,后面的校验写得再细也没用。

这个坑很常见,因为页面上选择文件的动作是正常的,开发者容易误以为请求也正常。看服务端数据,判断会更快。


二、UPLOAD_ERR_INI_SIZE 和 post_max_size 要一起看

PHP 文件上传总失败?从 $_FILES、大小限制到 move_uploaded_file() 一次排清 - php中文网

头像稍微大一点就失败,问题通常在限制链路上。Nginx 可能先用 client_max_body_size 拦掉,PHP 也可能因为 upload_max_filesize 或 post_max_size 拿不到完整请求。

upload_max_filesize = 8M
post_max_size = 10M
max_file_uploads = 20

• 浏览器看到 413 Request Entity Too Large,先查 Nginx 入口限制。

• $_FILES['avatar']['error'] 是 UPLOAD_ERR_INI_SIZE,看 PHP 配置。

• post_max_size 要大于单文件大小,还要留出表单字段和请求开销。

大小限制不是一个开关,而是一条链。

线上排查时建议把错误码打进日志。只给用户返回“上传失败”,开发侧很难知道请求死在哪一层。


三、只看后缀不够,finfo_file() 和 getimagesize() 都要用

PHP 文件上传总失败?从 $_FILES、大小限制到 move_uploaded_file() 一次排清 - php中文网

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

上传图片最危险的写法,是只判断文件名后缀。攻击者可以把脚本文件改成图片名,或者让文件内容和扩展名对不上。更靠谱的做法是同时看 MIME、图片尺寸和扩展名白名单。

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['avatar']['tmp_name']);
$size = getimagesize($_FILES['avatar']['tmp_name']);

• MIME 用 finfo_file() 或 finfo::file() 判断,别信浏览器传来的 type。

• 图片上传可以用 getimagesize() 兜一层,尺寸异常就拒绝。

• 白名单只放 jpg、jpeg、png、webp 这类明确格式。

文件名只能参考,不能当证据。

安全一点的上传目录也不要允许 PHP 执行。就算校验被绕过,目录权限也能再拦一层。


四、move_uploaded_file() 前后都要处理路径和文件名

PHP 文件上传总失败?从 $_FILES、大小限制到 move_uploaded_file() 一次排清 - php中文网

文件校验通过后,落盘也容易出问题。move_uploaded_file() 只负责把临时文件移动到目标路径,不会帮你创建目录、处理重名、修权限,也不会替你决定文件名是否安全。

$name = bin2hex(random_bytes(16)) . '.jpg';
$target = __DIR__ . '/uploads/avatar/' . $name;
move_uploaded_file($_FILES['avatar']['tmp_name'], $target);

• 用 is_uploaded_file() 确认来源,避免普通路径被当成上传文件。

• 不要直接使用用户原始文件名,容易覆盖文件,也容易带进奇怪字符。

• 目标目录要提前创建,权限只给写入需要的范围。

上传成功不代表存得安全。

头像上传这种功能看起来小,坑点却很密:入口格式、大小限制、文件内容、目录权限全都要过一遍。把错误码和落盘路径记清楚,排查速度会快很多。


别把上传当成一个函数调用,它其实是一条请求链路。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10484

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6141

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2115

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3888

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4574

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3591

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5137

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4022

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12002

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习