PHP表单文件上传脚本失效排查求助:原正常现无法上传文件
这种改完代码后某功能突然罢工、还没法回退的情况真的让人头大😅,不过好在你其他功能(PDF生成、文件夹创建)都正常,说明服务器环境和基础权限没大问题,咱们聚焦在上传相关的细节上,按这个顺序查:
先检查表单的
enctype属性
这绝对是最容易被忽略的坑!如果表单没加enctype="multipart/form-data",文件上传根本没法工作。你说修改了文本和新增了内容,会不会不小心删掉或者改了表单的这个属性?直接看你的表单标签:<form method="post" action="你的处理脚本.php" enctype="multipart/form-data">一定要确保这个属性存在且完全正确。
核对文件输入的
name和后端接收变量
要是你改了表单里文件输入框的name值,比如原来的name="docs[]"改成了别的,但后端还是用$_FILES['docs']来接收,那肯定拿不到文件。检查前端的文件输入:<input type="file" name="docs[]" multiple> <!-- 假设是多文件上传的场景 -->再对应后端处理
$_FILES数组的代码,确保name完全匹配,大小写也要注意!检查上传大小限制是否被改动
虽然之前正常,但会不会在新增的代码里改了上传限制?比如脚本里加了这些配置但数值太小:ini_set('upload_max_filesize', '2M'); // 要是你的文档大于2M就会失败 ini_set('post_max_size', '2M');可以在处理脚本里加一段代码打印当前的上传配置,看看是不是被改了:
echo "upload_max_filesize: " . ini_get('upload_max_filesize') . "<br>"; echo "post_max_size: " . ini_get('post_max_size') . "<br>"; echo "max_file_uploads: " . ini_get('max_file_uploads') . "<br>";注意
max_file_uploads至少要设为3,不然没法同时传3个文件。查看文件上传的错误码(关键!)
PHP的$_FILES数组里每个文件都自带error字段,能直接告诉你问题根源。在处理上传的代码里加一段调试代码:if (isset($_FILES['docs'])) { foreach ($_FILES['docs']['error'] as $key => $error) { echo "第".($key+1)."个文件的错误码:".$error."<br>"; // 给你对应下错误码含义: // 0=上传成功 | 1=超过upload_max_filesize限制 | 2=超过表单MAX_FILE_SIZE限制 // 3=文件仅部分上传 | 4=未选择文件 | 6=临时文件夹缺失 | 7=文件写入磁盘失败 } }看错误码基本能定位80%的问题,比如如果是6,那可能是临时文件夹权限出问题了,但你之前正常,会不会改代码时不小心动了相关配置?
确认目标文件夹的写入权限
你说文件夹能正常创建,但创建后的权限是不是够服务器写入?比如用mkdir()的时候有没有加正确的权限参数:mkdir($target_dir, 0755, true); // 0755一般能保证服务器有写入权限可以临时打印目标文件夹的权限看看:
echo "目标文件夹权限:".decoct(fileperms($target_dir))."<br>";要是权限不对,临时改成775(别用777,不安全)测试下,排除权限问题。
排查上传逻辑的代码改动
你新增的内容里,会不会在上传代码前加了输出(比如echo、var_dump),导致HTTP头已经发送,影响了文件上传?或者有没有改了文件移动的路径?比如原来的$target_file = $target_dir . basename($_FILES['docs']['name'][$key]);是不是写错了路径?另外,有没有加过严的文件名过滤?比如禁止了某些后缀,但你上传的文档后缀刚好在黑名单里?
要是以上都排查完还是没找到问题,建议把表单部分和上传处理的核心代码贴出来(敏感信息记得打码),这样更容易精准定位问题。
内容的提问来源于stack exchange,提问作者Str1fe

