Laravel中storage目录视频无法在Blade播放如何解决
Laravel Storage 存储视频在Blade中无法播放排查方案
按以下顺序逐一排查即可解决90%以上的同类问题:
- 首先确认软链是否生成
Laravel默认禁止web直接访问storage目录下的文件,public目录下的storage路径本质是指向storage/app/public的软连接,未生成软链时哪怕路径拼写完全正确,也会返回404无法加载文件。
直接在项目根目录执行命令生成软链:
php artisan storage:link
注意:如果你的视频文件是上传到
storage/app目录而非storage/app/public目录,软链默认无法访问到文件,要么将视频文件迁移到storage/app/public下的对应目录,要么手动为存储视频的目录创建指向public目录的软链。
核对路径拼接是否重复
先打开浏览器开发者工具的「网络」面板,找到视频资源的请求,查看状态码:- 如果状态码为404:先检查数据库中存储的
vid_path字段值,如果字段本身已经带了storage/前缀,模板中再次拼接storage/就会出现路径重复。你可以直接在模板中临时打印生成的路径,和服务器实际文件路径做比对,去掉重复的前缀即可。 - 软链生成后可以直接进入项目
public目录,查看是否存在storage快捷方式/软链文件夹,点进该文件夹确认是否能看到videos目录及对应的目标视频文件。
- 如果状态码为404:先检查数据库中存储的
检查文件权限与文件完整性
如果视频请求返回200状态码但依旧无法播放:- 给storage目录开放正确的读权限,Linux环境下执行以下命令:
chmod -R 755 storage chown -R www-data:www-data storage- 找到服务器上存储的原视频文件,直接拖到本地浏览器中播放,确认文件没有在上传过程中损坏、编码格式为浏览器支持的H.264编码MP4格式。
优化模板代码
你当前代码中硬编码的ogg源路径movie.ogg不存在时会额外产生无意义的404请求,不需要可以直接删除,优化后的代码参考:
@php $video = \App\Video::where('vid_id', $vid_id)->first(); // 自动适配路径,避免重复拼接storage前缀 $videoUrl = str_starts_with($video->vid_path, 'storage/') ? asset($video->vid_path) : asset('storage/' . $video->vid_path); @endphp <video controls preload="metadata" style="width: 100%;"> <source src="{{ $videoUrl }}" type="video/mp4"> 您的浏览器不支持HTML5视频标签,请升级浏览器后重试。 </video>
如果你使用Laravel内置的public文件系统驱动存储视频,更推荐直接调用
Storage::disk('public')->url($video->vid_path)生成访问地址,不需要手动拼接路径,能避免绝大多数路径拼写错误。
内容的提问来源于stack exchange,提问作者etranz
相关产品推荐
相关产品推荐

