php文件上传失败主因是环境配置与权限问题,需依次排查:一、确认php.ini中file_uploads=on、upload_max_filesize和post_max_size等配置合理并重启服务;二、确保upload_tmp_dir及目标目录对www-data用户可写;三、验证表单含enctype="multipart/form-data"且name匹配,php脚本正确处理$_files['error']与tmp_name。

PHP 上传文件失败,通常不是代码写错了,而是环境配置或权限没到位。问题集中在三块:PHP 配置是否放开、目录有没有写权限、表单和脚本是否合规。下面按排查顺序说清楚。
检查 php.ini 关键配置是否生效
很多失败其实卡在默认限制上,尤其是大文件或多个文件上传时:
- file_uploads = On —— 必须开启,否则整个上传功能被禁用
- upload_max_filesize = 20M —— 单个文件最大允许大小,按需调整(如需传 50MB 视频,这里至少设 50M)
- post_max_size = 55M —— 整个 POST 请求总大小,必须 ≥ upload_max_filesize × 文件数 + 表单字段开销(比如传 3 个 15MB 文件,建议设 55M 起)
- max_execution_time = 300 和 max_input_time = 300 —— 防止大文件上传中途超时中断
- 改完后一定要重启 Web 服务(
sudo systemctl restart apache2或sudo systemctl restart php-fpm nginx),并用phpinfo()或echo ini_get('post_max_size');确认值已更新
确认临时目录与目标目录可写
上传分两步:先存到临时目录(upload_tmp_dir),再移到你指定的位置。任一环节权限不对都会失败:
- 查 PHP 用的临时目录:
echo sys_get_temp_dir();或看phpinfo()中upload_tmp_dir行;确保该目录存在且对 Web 用户(如www-data)可读写 - 目标保存路径(如
/var/www/html/uploads/)也要有写权限:sudo chown -R www-data:www-data uploads,再sudo chmod -R 755 uploads - 别用
chmod 777—— 生产环境有安全风险,只在调试时临时用 - 如果目标路径是多级(如
uploads/avatar/2026/),PHP 不会自动创建,需在move_uploaded_file()前加mkdir($dir, 0755, true)
验证表单结构与 PHP 处理逻辑
前端和后端不匹配,$_FILES 就会为空或报错:
- HTML 表单必须带
enctype="multipart/form-data",缺了这个,浏览器根本不会发二进制数据 -
<input type="file" name="avatar">的name值,要和 PHP 里$_FILES['avatar']完全一致 - 上传前先检查错误码:
if ($_FILES['avatar']['error'] !== UPLOAD_ERR_OK) { echo '错误:' . $_FILES['avatar']['error']; },根据返回数字快速定位(1=超 php.ini 限制,4=没选文件,6=找不到临时目录,7=写入失败) - 移动文件必须用
$_FILES['avatar']['tmp_name'],不能用$_FILES['avatar']['name']—— 后者只是原始文件名,不是服务器上的临时路径
别漏掉 Web 服务器层限制
PHP 配置调好了,Nginx 或 Apache 还可能拦着:
- Nginx:检查
client_max_body_size,需 ≥post_max_size(例如加一行client_max_body_size 60M;到 server 块) - Apache:检查
LimitRequestBody,默认可能是 0(不限),但若设了小值(如 1048576 = 1MB),也得调大 - 改完同样要重启对应服务
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











