PHP文件上传大小需同时设置upload_max_filesize和post_max_size,且后者不小于前者;还需同步调整Web服务器(如nginx的client_max_body_size)和检查临时目录权限。

php.ini 中 upload_max_filesize 和 post_max_size 怎么设
PHP 文件上传大小受两个配置项共同限制:upload_max_filesize 控制单个文件上限,post_max_size 控制整个 POST 请求体总大小(含文件、表单字段等)。二者必须同时调大,且 post_max_size ≥ upload_max_filesize,否则即使文件没超限,也会因 POST 总量超限而失败。
修改方式:编辑 php.ini,例如设为 100MB:
upload_max_filesize = 100M post_max_size = 105M
注意单位不区分大小写(M / m / MB 均可),但不能写成 100MB(部分旧版本解析失败);数值不能带空格;改完必须重启 Web 服务(如 Apache 或 PHP-FPM)才生效。
为什么改了 php.ini 还是报 “File upload error – unable to create a temporary file”
这个错误常被误认为是大小限制问题,实际多与临时目录权限或磁盘空间有关。PHP 上传时需将文件暂存到 upload_tmp_dir 指定路径(默认通常是系统临时目录,如 /tmp),若该目录不可写、已满、或 SELinux/AppArmor 限制了写入,就会触发该错误,和 upload_max_filesize 无关。
立即学习“PHP免费学习笔记(深入)”;
排查建议:
- 检查
upload_tmp_dir设置是否明确指向一个可写的目录(如/var/tmp/php-uploads),并确保 Web 进程用户(如 www-data、nginx、apache)有读写权限 - 运行
df -h /tmp查看磁盘剩余空间 - 在脚本中用
var_dump(ini_get('upload_tmp_dir'))和is_writable()验证实际生效值和可写性
nginx 或 Apache 是否也有限制?怎么同步调整
Web 服务器本身会拦截超大请求,不转发给 PHP,因此即使 php.ini 放开了,仍可能卡在网关层。
后台主要功能如下:1) 系统管理:管理员管理,网站配置,上传文件管理,QQ-MSN 在线客服设置。2) 企业信息:后台自由添加修改企业的各类信息及介绍。3) 产品管理:产品类别新增修改管理,产品添加修改以及产品的审核。4) 调查管理:发布修改新调查。5) 会员管理:查看修改删除会员资料,及锁定解锁功能。可在线给会员发信!6) 新闻管理:能分大类和小类新闻,不再受新闻栏目的限制。7) 留言管理:管理
常见配置:
- nginx:在
http、server或location块中加client_max_body_size 100M(单位支持M或m) - Apache 2.4+:在虚拟主机或目录配置中加
LimitRequestBody 104857600(单位是字节,100MB = 104857600) - Apache + mod_php:还需确认
LimitRequestFieldSize和LimitRequestLine不影响 multipart boundary 解析(一般默认足够)
改完 nginx 需 nginx -t && nginx -s reload;Apache 需 apachectl configtest && systemctl reload httpd。
代码里怎么检测上传是否因大小被拒
PHP 上传失败后,$_FILES['xxx']['error'] 会返回对应错误码,而不是抛异常。关键判断点:
-
UPLOAD_ERR_INI_SIZE(值为 1):文件超过upload_max_filesize -
UPLOAD_ERR_FORM_SIZE(值为 2):表单中MAX_FILE_SIZE隐藏字段限制(前端可控,不可信) -
UPLOAD_ERR_POST_SIZE(值为 3):整体 POST 超过post_max_size
示例判断逻辑:
if ($_FILES['avatar']['error'] === UPLOAD_ERR_INI_SIZE) {
echo '文件太大,请小于 ' . ini_get('upload_max_filesize');
}
注意:UPLOAD_ERR_NO_FILE(0)才是上传成功,其他非 0 值都代表失败,不要只检查是否为空数组。
真正容易被忽略的是三处配置的协同:php.ini 的两个参数、Web 服务器的 body 限制、以及前端隐藏字段的误导性提示。任一环节卡住,用户看到的都是“上传失败”,但原因完全不同。










