You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:42:18