php上传失败核心在于环境配置与流程断点:先查$_files是否为空(表单缺enctype或method非post),再看error码(如1超upload_max_filesize、6临时目录写入失败),最后排查upload_tmp_dir权限及nginx client_max_body_size等服务器层限制。

PHP上传附件失败,通常不是代码写错,而是环境配置或流程断点没被看见。核心问题集中在“文件根本没进PHP”或“进了但被拦在半路”。先看$_FILES是否为空,再查error码,最后盯住临时目录和服务器边界限制。
表单和请求层面的硬性门槛
这是最常被跳过的一步:如果表单没达标,PHP连$_FILES都不会生成。
- form标签必须带enctype="multipart/form-data",缺了这个,浏览器不会按二进制编码发文件,PHP收不到任何上传数据
- method必须是POST,GET不支持文件传输
- input[type=file]必须有name属性,且PHP中引用的名字要完全一致(大小写、下划线、中括号都不能错)
- 避免在表单里嵌套其他表单,DOM结构混乱会导致name丢失
PHP配置项的连锁限制
upload_max_filesize不是唯一瓶颈,它和post_max_size、max_execution_time等形成一套“通关条件”,任一不满足都会失败。
- file_uploads = On:必须开启,否则整个上传功能被禁用
- upload_max_filesize:单个文件上限,比如设为100M,就别传105M的文件
- post_max_size:必须≥ upload_max_filesize + 其他表单字段总长,建议设为upload_max_filesize的1.2倍以上(如128M)
- max_input_time:控制接收全部POST数据(含大文件)的最长时间,上传500MB文件时网络慢,至少设300秒(5分钟)
- max_execution_time:后续处理(如move_uploaded_file、验MD5)也耗时,需同步调高
临时目录与权限陷阱
PHP收到文件后,会先存到临时目录(由upload_tmp_dir指定),再由脚本move_uploaded_file()搬走。这一步卡住,错误码往往是6或7。
- 执行php -r "echo sys_get_temp_dir();"确认当前临时路径
- 检查该目录是否存在、磁盘是否有空间、Web服务用户(如www-data或nginx)是否有读+写+执行权限
- 不要用/tmp/php_uploads这类自建路径却忘了chown,Linux下权限不对=上传静默失败
Web服务器层的额外拦截
请求甚至可能根本没到达PHP——Nginx或Apache会在入口就拒绝大请求。
- Nginx需设置client_max_body_size,值应≥ post_max_size(例如128M),否则返回413 Request Entity Too Large
- Apache需检查LimitRequestBody指令,同样要放开限制
- 改完php.ini或Nginx配置后,必须重启PHP-FPM或Apache服务,reload不生效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











