如何用PHP获取原始格式音频文件?附代码求助
如何使用PHP获取专辑文件夹中的原始音频文件
先聊聊你现有代码存在的几个小问题:
- 循环里反复执行
chdir切换目录,最后$curr_dir只会指向最后一个专辑的目录,所以只能拿到最后一个专辑的文件,没法获取用户所有专辑里的音频。 scandir会返回目录下所有条目(包括.和..这两个特殊目录),而且不会自动过滤非音频文件。
下面是优化后的代码,能帮你精准获取所有用户专辑里的原始音频文件:
<?php // 获取当前登录用户ID $user = $_SESSION['user_id']; // 改用预处理语句避免SQL注入风险 $sql = "SELECT * FROM albums WHERE user_id=?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $user); // 假设user_id是整数类型,若为字符串则用"s" $stmt->execute(); $result = $stmt->get_result(); // 定义需要筛选的音频文件扩展名,可根据需求增减 $audioExtensions = ['mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac']; $allAudioFiles = []; if ($result->num_rows > 0) { // 遍历用户的每一张专辑 while ($row = $result->fetch_assoc()) { $albumDir = "uploaded/" . $row['al_id']; // 先检查专辑目录是否存在,避免报错 if (!is_dir($albumDir)) { continue; } // 扫描当前专辑目录下的所有内容 $files = scandir($albumDir); foreach ($files as $file) { // 跳过当前目录和上级目录的特殊标识 if ($file === '.' || $file === '..') { continue; } // 获取文件扩展名并转为小写,统一判断逻辑 $fileExt = strtolower(pathinfo($file, PATHINFO_EXTENSION)); // 如果是目标音频格式,就存入结果数组 if (in_array($fileExt, $audioExtensions)) { $allAudioFiles[] = [ 'album_id' => $row['al_id'], 'file_name' => $file, 'full_path' => realpath($albumDir . '/' . $file) // 获取文件绝对路径,方便后续操作 ]; } } } } // 输出所有音频文件信息 print_r($allAudioFiles); ?>
代码细节说明:
- 避免目录切换混乱:直接用路径拼接
$albumDir = "uploaded/" . $row['al_id'],不用chdir,不会干扰脚本的当前工作目录。 - 安全检查:增加
is_dir判断专辑目录是否存在,防止因目录缺失抛出错误。 - 精准筛选音频:通过定义扩展名数组,配合
pathinfo和in_array,只保留音频格式的文件。 - 结构化结果:把每个音频文件的专辑ID、文件名、绝对路径都整理好,后续不管是播放还是下载都更方便。
- SQL注入防护:把原代码的字符串拼接SQL改成预处理语句,提升系统安全性。
额外小提示:
- 如果需要支持更多音频格式,直接在
$audioExtensions数组里添加对应的扩展名就行。 - 要是你只需要相对路径,可以把
realpath替换成$albumDir . '/' . $file。
内容的提问来源于stack exchange,提问作者user7807032
相关产品推荐
相关产品推荐

