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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:40:44