使用Laravel getID3包上传音乐时正确存储专辑封面的方法
问题原因
- 原有代码中注释的封面存储逻辑错误调用了音乐上传文件实例的
storeAs方法,本质是将完整音乐文件写入了图片后缀的文件中,所以无法正常读取、文件大小和音乐一致 getArtwork(true)返回的本身就是Laravel的UploadedFile实例,需要调用该实例自身的存储方法才能正确写入专辑封面
修正后代码
if($request->hasfile('songs')){ foreach ( $request->file('songs') as $key => $file){ $track = new getID3($file); $tifo = $track->extractInfo(); // 空值兜底,避免元数据缺失时报错 $artistName = $track->getArtist() ?? '未知艺术家'; $songName = $track->getTitle() ?? '未知歌曲'; $albumName = $track->getAlbum() ?? '未知专辑'; $extension = $track->getFileFormat(); $thumbnail = $track->getArtwork(true); // 生成唯一音乐文件名,避免重名覆盖 $location = time() . uniqid() . '.' . $extension; // 存储音乐文件 $file->storeAs('public/songs', $location); // 处理专辑封面存储 $thumbnails = null; if ($thumbnail) { $thumbExt = $thumbnail->getClientOriginalExtension(); // 用uniqid生成唯一封面名,避免同一时间上传的文件重名 $thumbnails = 'artwork-' . uniqid() . '.' . $thumbExt; // 调用封面实例自身的存储方法,写入指定目录 $thumbnail->storeAs('public/sthumbs', $thumbnails); } // 移除重复的无用实例化代码 $music_upload_file = new MusicUpload(); $music_upload_file->user_id = Auth::user()->id; $music_upload_file->filename = $songName; $music_upload_file->extension = $extension; $music_upload_file->artistname = $artistName; $music_upload_file->albumname = $albumName; $music_upload_file->location = $location; $music_upload_file->thumbnail = $thumbnails; $music_upload_file->save(); } }
后续配置
要在前端正常展示封面,需要先执行Laravel存储软连接命令:php artisan storage:link
封面的访问路径为:asset('storage/sthumbs/' . $music_upload_file->thumbnail)
内容的提问来源于stack exchange,提问作者throwawaydev
相关产品推荐
相关产品推荐

