PHP文件上传后无法输出Ok提示的问题排查请求
问题排查:文件上传判断失效问题
我们的程序预期实现:用户上传文件时输出“Ok”,未上传文件时输出“请选择所需文件”。但实际测试发现,即使上传了文件,程序仍输出“请选择所需文件”,第三个if块未生效。
HTML表单通过POST方法提交,enctype设为multipart/form-data;PHP代码先检查请求方法为POST,再确认uploadBtn被触发,最后判断是否上传了文件,但第三个if块始终不执行,进入else分支。
HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .container{ max-width: 600px; background: #fff; position: relative; height: 151px; border-radius: 5px; margin: 0 auto; margin-top: 300px; box-shadow: 0px 0px 6px 1px #efefef; padding-top: 118px; } .msg{ position: absolute; top: -14px; background: #f9f9f9; width: 100%; padding: 14px 16px; box-sizing: border-box; color: #000; text-align: right; width: 85%; left: 0; transform: translate(8%,50%); border-right: 3px solid #00ceff; } form{ justify-content: center; align-items: center; flex-direction: column; margin: 0 40px; } div.upload-wrapper{ color: white; font-weight: bold; display: flex; } input[type="file"] { position: absolute; left: -9999px; } input[type="submit"]{ color: white; background: #33bb30; margin: 10px 0; border-radius: 5px; font-weight: bold; padding: 9px 30px; cursor: pointer; border: none; } input[type="submit"]:hover{ background: #555; } label[for="file-upload"]{ padding: 0.7rem; display: inline-block; background: #5d9eff; cursor: pointer; border-radius: 0 5px 5px 0; border-left: 0; } label[for="file-upload"]:hover{ background: #ca3103; } span.file-name{ padding:0.7rem 14rem 0.7rem 0.7rem; white-space: nowrap; overflow: hidden; background: #ececec; color: black; border: 1px solid #ececec; border-radius: 5px 0 0 5px; border-right: 0; width: 100%; } </style> </head> <body> <div class="container"> <form method="POST" action="upload.php" enctype="multipart/form-data"> <div class="upload-wrapper"> <span class="file-name">Choose a file...</span> <label for="file-upload">Browse</label> <input type="file" id="file-upload" name="uploadedFile"> </div> <input type="submit" name="uploadBtn" value="Upload"/> </form> </div> </body> </html>
PHP代码(原问题版本)
<?php session_start(); $msg = null; if ($_SERVER["REQUEST_METHOD"]=="POST"){ if(isset($_POST["uploadBtn"]) && $_POST["uploadBtn"]=="Upload"){ if(isset($_POST["uploadedFile"]) && !empty($_POST["uploadedFile"])){ echo $msg="Ok"; }else{ echo $msg="Please select the desired file!"; } } }
问题原因与修复方案
核心问题
当表单设置enctype="multipart/form-data"时,上传的文件信息不会被存入$_POST数组,而是被PHP解析到$_FILES全局变量中。原代码通过$_POST["uploadedFile"]判断文件是否上传,逻辑完全错误,导致永远进入else分支。
修复后的PHP代码
<?php session_start(); $msg = null; if ($_SERVER["REQUEST_METHOD"]=="POST"){ if(isset($_POST["uploadBtn"]) && $_POST["uploadBtn"]=="Upload"){ // 通过$_FILES判断文件是否成功上传 if(isset($_FILES["uploadedFile"]) && $_FILES["uploadedFile"]["error"] === UPLOAD_ERR_OK){ echo $msg="Ok"; }else{ echo $msg="请选择所需文件"; } } }
关键说明
$_FILES["uploadedFile"]["error"]是PHP提供的文件上传状态码,UPLOAD_ERR_OK(值为0)表示文件上传成功- 状态码为4时,表示用户未选择任何文件,刚好对应我们需要的“未上传文件”提示场景
- 无需保存文件的前提下,仅判断状态码为0即可满足需求
内容的提问来源于stack exchange,提问作者reza nozadi
相关产品推荐
相关产品推荐

