PHP无法获取表单上传文件求助(已配置multipart/form-data)
文件上传故障排查:PHP无法接收表单文件
修正拼写错误后,表单文本字段可正常存入SQL数据库,但上传用户提交的身份证正反文件时,PHP无法找到发送的文件。表单已设置method="post"和encpart="multipart/form-data",字段名与PHP代码中一致,问题仍存在。
PHP环境配置:
- 已开启文件上传功能
max_file_upload设为8MB,post_max_size设为250MB,远大于测试图片大小(261KB和193KB)- 使用PHP 8.1.0版本
测试发现:$_FILES返回空数组,$_FILES['idavant']和$_FILES['idarriere']均为NULL,提示文件不存在但$_FILES['idavant']['error']为0。
HTML表单代码(除文件输入外其他字段正常)
<section id="form"> <form action="submit_signature.php" method="post" encpart="multipart/form-data"> <label for="nom">Nom :</label><br> <input type=text name="Nom" id="Nom" class="big" required><br> <label for="prenom">Prénom :</label><br> <input type=text name="Prénom" id="prenom" class="big" required><br> <label for="pseudo">Pseudonyme :</label><br> <input type=text name="Pseudonyme" id="pseudo" class="big" placeholder="Nom sous lequel vous apparaîtrez dans les dernières signatures."><br> <label for="daten">Date de naissance :</label><br> <input type=date name="Datenaissance" id="daten" min="1907-03-04" max="2006-01-01" class="smol" required><br> <label for="email">E-mail :</label><br> <input type=email name="Email" id="email" class="smol" placeholder="Adresse mail en cas de pépin pour vous contacter !" required><br> <label for="tel">N° de téléphone :</label><br> <input type=tel name="tel" id="tel" placeholder="+(X)XX X XX XX XX XX" class="smol" pattern="+[0-972]{3}-[0-9]{1}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}" required><br> <label for="idavant">Face avant de votre pièce d'identité :</label> <input type="file" id="idavant" name="idavant" value="download" required><br> <label for="idarriere">Face arrière de votre pièce d'identité :</label> <input type="file" id="idarriere" name="idarriere" value="download" required><br> <label for="motiv">Motivation :</label><br> <textarea name="Motivation" id="motiv" class="big" placeholder="Dites nous pourquoi vous signez cette pétition, si cela vous dit !"></textarea><br><br> <input type=submit name="Envoyer" id="envoyer" value="Envoyer"> <input type=reset name="Réinitialiser" id="reset" value="Réinitialiser"> </form> <br> <p id="formwarning">NB : Votre signature ne sera pas prise en compte tant que votre identité ne sera pas vérifiée, et votre inscription certifiée par nos administrateurs™.</p> </section>
PHP测试代码(仅针对idavant文件)
// Tests if the file exists and doesn't have errors if (isset($_FILES['idavant']['tmp_name']) && $_FILES['idavant']['error'] == 0) { // Tests if the file isn't too big if ($_FILES['idavant']['size'] <= 15000000) { // Tests if it is an authorized file extension $fileInfo = pathinfo($_FILES['idavant']['name']); $extension = $fileInfo['extension']; $allowedExtensions = ['jpg', 'jpeg', 'gif', 'png']; if (in_array($extension, $allowedExtensions)) { // If all conditions are satisfied, file is uploaded definitively to the server move_uploaded_file($_FILES['idavant']['tmp_name'], 'uploads/' . basename($_FILES['idavant']['name'])); echo "L'envoi a bien été effectué !"; } else { error_log("Erreur de téléchargement du fichier ", 3, "log1.txt"); } } else { error_log("Erreur de téléchargement du fichier : Le fichier est trop gros; ", 3, "log1.txt"); } } else { error_log("Erreur de téléchargement du fichier : Erreur dans la procédure de transfert entre les pages; ", 3, "log1.txt"); //Tests if the file exists. Always throws the file doesn't exist error. if (isset($_FILES['idavant']['tmp_name'])) { echo "Le fichier existe."; } else { echo "Le fichier n'existe pas"; } //Tests if the file hasn't errors attached to it. This time, it tells me that there is no errors. if ($_FILES['idavant']['error'] == 0) { echo "Le fichier est bien sans erreur"; } else { echo "bah non mdr"; } //Dumping the content of the different $_FILES variable. Returns an empty array and two NULLS. echo "<br/>".var_dump($_FILES); echo "<br/>".var_dump($_FILES['idavant']); echo "<br/>".var_dump($_FILES['idarriere']); }
解决方案
核心问题是HTML表单中的属性拼写错误:将encpart="multipart/form-data"改为enctype="multipart/form-data"。
浏览器只有在表单正确设置enctype="multipart/form-data"时,才会以多部分表单数据格式发送文件,否则只会发送文本字段,文件数据不会被传递到PHP,导致$_FILES为空数组。
修改后重新测试,文件即可正常被PHP接收并处理。
内容的提问来源于stack exchange,提问作者Emarley
相关产品推荐
相关产品推荐

