Laravel集成laravel-getid3处理多音频文件元数据问题求助
问题修复方案
你遇到的报错核心原因是注释段代码中实例化getID3时,传入的是整个多文件上传数组$request->file('songs'),而非循环内当前遍历的单个文件对象,和扩展本身是否支持多文件无关,只需调整调用逻辑即可。
修复后完整代码
public function store(Request $request) { $input = $request->all(); if($request->hasfile('songs')){ foreach ($request->file('songs') as $uploadFile) { // 先获取当前单个文件的临时路径用于提取元数据 $trackInfo = new \getID3($uploadFile->getPathname()); $tifo = $trackInfo->extractInfo(); // 打印元数据查看可提取字段,比如时长、歌手、专辑等 // print_r($tifo); $nametag = $uploadFile->getClientOriginalName(); $name = explode('.',$nametag)[0]; $extension = $uploadFile->extension(); $filesize = $uploadFile->getSize(); $saveFileName = time() . uniqid() . '.' . $extension; $location = $saveFileName; $uploadFile->storeAs('public/songs', $saveFileName); $musicRecord = new MusicUpload(); $musicRecord->user_id = Auth::user()->id; $musicRecord->filename = $name; // 可新增字段存储提取到的元数据,例如下方的时长字段 // $musicRecord->duration = $tifo['playtime_seconds'] ?? 0; // $musicRecord->artist = $tifo['tags']['id3v2']['artist'][0] ?? '未知歌手'; $musicRecord->extension = $extension; $musicRecord->filesize = $filesize; $musicRecord->location = $location; $musicRecord->save(); } } return response()->json([ 'uploaded' => true ]); }
核心修改说明
- 修正
getID3传参:循环内传入当前单个文件的临时路径$uploadFile->getPathname(),避免传入多文件数组导致报错 - 删除冗余逻辑:原有代码中
$datas数组存在重复覆盖同一键名的问题,内层遍历$datas的逻辑完全多余,直接在循环内给模型赋值即可 - 避免变量冲突:将循环内的文件对象和模型对象变量名拆分,避免后续逻辑覆盖文件对象
替代实现方案
如果需要支持更多音频格式、提取更全面的元数据,可使用php-ffmpeg扩展替代laravel-getid3,该扩展基于FFmpeg,可覆盖绝大多数音视频格式的元数据提取需求,调用逻辑和上述方案类似,只需在循环内逐个传入单个文件即可。
内容的提问来源于stack exchange,提问作者throwawaydev
相关产品推荐
相关产品推荐

