PHP表单无法获取音频文件数据问题求助
音频文件上传失败排查($_FILES error:4)
问题背景
正在学习input type="file"的工作机制,尝试通过PHP表单上传文件并存储到数据库。表单已设置enctype="multipart/form-data",包含文本、日期、音频和图片上传字段。当前仅图片上传正常,能获取文件名并保存到指定目录;但上传音频时页面空白,$_FILES["audio"]["name"]返回空值,var_dump显示audio的error为4,无有效数据。仅提交空音频字段时可正常存入数据库。
相关代码
表单代码
<form action="../src/add.php" class="addform" method="post" enctype="multipart/form-data"> <div class="addform__group mb-20"> <input type="text" placeholder="Nom de l'artiste" name="artist" class="form-control mr-30"> <input type="text" placeholder="Titre" name="title" class="form-control"> </div> <div class="addform__group mb-20"> <input type="text" placeholder="Label" name="label" class="form-control mr-30"> <input type="text" placeholder="Vocaliste" name="vocal" class="form-control"> </div> <div class="addform__group mb-20"> <select name="genre" id="genre" class="form-control mr-30" style="width: 282px;"> <?php $result = $stmt->get_result(); while($row = $result->fetch_assoc()) { ?> <option value="<?php echo $row["id"] ?>"><?php echo $row["name"] ?></option> <?php } ?> </select> <input type="date" id="date-picker" class="form-control" name="created-at"> </div> <!-- Upload audio and image --> <div class="addform__group mb-20" style="display: flex; justify-content: space-between;"> <div> <input type="file" id="audio" name="audio"> <label for="audio"><i class="fas fa-music mr-10"></i> Audio (jpg)</label> <label id="audio-name"></label> </div> <div> <input type="file" id="image" name="image"> <label for="image"><i class="fas fa-image mr-10"></i> Image (jpg)</label> <label id="image-name"></label> </div> </div> <div class="addform__group"> <button type="submit" name="submit">Ajouter</button> </div> </form>
PHP处理代码(add.php)
if(isset($_POST["submit"])) { // Get the data from the form $artiste = $_POST["artist"]; $title = $_POST["title"]; $label = $_POST["label"]; $vocal = $_POST["vocal"]; $genre = $_POST["genre"]; $date = $_POST["created-at"]; $audio = $_FILES["audio"]["name"]; $image = $_FILES["image"]["name"]; // Query to insert a new music $sql = "INSERT INTO `music` (`artist`, `title`, `label`, `vocal`, `genre_id`, `created_at`, `audio`, `image`) VALUES ('$artiste', '$title', '$label', '$vocal', '$genre', '$date', '$audio', '$image')"; $result = mysqli_query($conn, $sql); // Check result and errors if($result) { echo 'Musique ajoutée'; } else { echo 'Erreur: ' . mysqli_error($conn); } // Upload image file in a directory $imageDir = "../upload/img/"; $imageFile = $imageDir . basename($_FILES["image"]["name"]); if(move_uploaded_file($_FILES["image"]["tmp_name"], $imageFile)) { echo "Image uploaded"; } else { echo "Image not uploaded"; } // Upload audio file in a directory $audioDir = "../upload/audio/"; $audioFile = $audioDir . basename($_FILES["audio"]["name"]); if(move_uploaded_file($_FILES["audio"]["tmp_name"], $audioFile)) { echo "Audio uploaded"; } else { echo "Audio not uploaded"; } }
仅上传图片时的var_dump($_FILES)结果
array (size=2) 'audio' => array (size=6) 'name' => string '' (length=0) 'full_path' => string '' (length=0) 'type' => string '' (length=0) 'tmp_name' => string '' (length=0) 'error' => int 4 'size' => int 0 'image' => array (size=6) 'name' => string 'koven-lionsvip.jpg' (length=18) 'full_path' => string 'koven-lionsvip.jpg' (length=18) 'type' => string 'image/jpeg' (length=10) 'tmp_name' => string 'C:\wamp64\tmp\php2C50.tmp' (length=25) 'error' => int 0 'size' => int 50412
排查与解决方案
1. 明确错误码4的含义
PHP文件上传错误码4表示没有上传任何文件,说明表单提交时音频文件未被正确传递到服务器。
2. 逐一排查修复
表单字段优化
音频上传标签标注Audio (jpg)属于错误引导,建议给音频输入框添加正确的文件类型限制,避免用户误选或浏览器拦截:<input type="file" id="audio" name="audio" accept="audio/*,.mp3,.wav,.ogg">调整PHP上传配置
音频文件通常比图片大,检查php.ini中的关键配置:upload_max_filesize: 设置为大于目标音频文件的大小(如10M)post_max_size: 值需大于upload_max_filesize(如12M)max_execution_time: 适当延长执行时间(如60)
修改后重启Web服务器生效。
检查目录权限
确认../upload/audio/目录存在,且Web服务器进程(如apache、www-data)拥有写入权限。目录不存在则先创建,权限不足可设置为755(测试环境可用777,生产环境需严格权限)。完善错误处理逻辑
PHP代码需先判断上传状态,再执行后续操作,避免空值报错:// 处理音频上传 $audio = ""; if ($_FILES["audio"]["error"] === UPLOAD_ERR_OK) { $audio = $_FILES["audio"]["name"]; $audioDir = "../upload/audio/"; $audioFile = $audioDir . basename($audio); if(move_uploaded_file($_FILES["audio"]["tmp_name"], $audioFile)) { echo "Audio uploaded"; } else { echo "Audio not uploaded: 移动文件失败"; } } else { switch($_FILES["audio"]["error"]) { case UPLOAD_ERR_INI_SIZE: echo "音频文件超过php.ini限制的大小"; break; case UPLOAD_ERR_FORM_SIZE: echo "音频文件超过表单限制的大小"; break; case UPLOAD_ERR_PARTIAL: echo "音频文件仅部分上传"; break; case UPLOAD_ERR_NO_FILE: echo "未选择音频文件"; break; default: echo "未知上传错误"; } }修复SQL注入风险
当前代码直接拼接用户输入到SQL语句,存在严重安全隐患,改用预处理语句:$sql = "INSERT INTO `music` (`artist`, `title`, `label`, `vocal`, `genre_id`, `created_at`, `audio`, `image`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ssssssss", $artiste, $title, $label, $vocal, $genre, $date, $audio, $image); $result = mysqli_stmt_execute($stmt);
内容的提问来源于stack exchange,提问作者stylaxxx
相关产品推荐
相关产品推荐

