Laravel Storage图片无法显示问题排查与解决求助
问题根源
你的数据库中$media->med_path存储的值是public/medias/jpg/57N8MJmsp2y8P0aexysV_200x200.jpg,而asset('storage/')已经对应到storage/app/public目录(通过软链和filesystems.php的public磁盘配置),两者拼接后生成的URL多了一层public,变成http://localhost:8000/storage/public/medias/...,但实际文件存储在storage/app/public/medias/...,对应正确的URL应该是http://localhost:8000/storage/medias/...,路径不匹配导致图片无法加载。
解决方法
方法1:修改视图中的路径拼接
直接移除med_path中的public/前缀,修改视图代码如下:
<img src="{{ asset('storage/' . str_replace('public/', '', $media->med_path)) }}" alt="Thumbnail" style="width: 100px; height: auto;">
方法2:修正数据库存储的路径(推荐)
如果是上传逻辑导致存储了多余的public/前缀,调整上传代码,让数据库只存储public磁盘下的相对路径(不含public/)。例如使用Laravel的存储门面上传时:
// 上传示例 $path = Storage::disk('public')->putFile('medias/jpg', $uploadedFile); // $path 的值为 medias/jpg/xxx.jpg,直接存入数据库即可
之后视图中保留原代码即可正常加载:
<img src="{{ asset('storage/' . $media->med_path) }}" alt="Thumbnail" style="width: 100px; height: auto;">
验证
执行php artisan storage:link后,项目根目录的public/storage是软链指向storage/app/public,所以URL中的/storage/会直接映射到storage/app/public目录。你可以手动访问正确的URL(http://localhost:8000/storage/medias/jpg/57N8MJmsp2y8P0aexysV_200x200.jpg)确认图片是否能正常打开。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi

