Laravel问题:使用Storage::url()无法显示图片
解决Laravel存储图片无法访问的404问题
核心原因
Laravel的Storage::put('ranker', ...)默认使用local磁盘,文件会存在storage/app/ranker目录下,但这个目录不直接对外提供Web访问。Storage::url()生成的/storage/...路径,实际指向的是public/storage目录(而非storage/app),因此需要通过软链接打通存储目录与Web访问目录的关联,或调整磁盘配置。
解决步骤
1. 创建默认存储软链接(最常用方案)
在项目根目录执行Laravel提供的Artisan命令,快速创建软链接:
php artisan storage:link
执行成功后,public/storage会成为storage/app/public的软链接,Web请求/storage/xxx会自动映射到storage/app/public/xxx。
接下来调整上传代码,将文件上传到public磁盘的ranker目录:
if ($request->file('file')) { // 改用public磁盘上传,文件会存到storage/app/public/ranker $filename = Storage::disk('public')->put('ranker', $request->file('file')); $ranker->image_url = $filename; $ranker->save(); }
视图中保持原有写法即可:
<img src="{{ Storage::url($ranker->image_url) }}" ... >
此时生成的/storage/ranker/xxx.png就能正常访问。
2. 迁移已上传文件(可选)
如果已有大量文件存在storage/app/ranker,可手动将这些文件移动到storage/app/public/ranker目录,再执行上述软链接命令,后续新文件按步骤1的方式上传即可。
3. 自定义磁盘配置(进阶)
若不想使用默认public磁盘,可在config/filesystems.php中添加自定义磁盘:
'disks' => [ // ... 其他磁盘配置 'ranker' => [ 'driver' => 'local', 'root' => storage_path('app/ranker'), 'url' => env('APP_URL').'/ranker', 'visibility' => 'public', ], ],
然后手动在public目录下创建软链接:
ln -s ../storage/app/ranker public/ranker
上传和视图代码调整为:
// 上传时使用自定义磁盘 $filename = Storage::disk('ranker')->putFile('', $request->file('file'));
<img src="{{ Storage::disk('ranker')->url($ranker->image_url) }}" ... >
验证要点
- 检查软链接是否生效:查看
public/storage(或自定义软链接)是否正确指向对应存储目录 - 确认目录权限:确保
storage/app/public和public/storage目录权限为755,文件权限为644
内容的提问来源于stack exchange,提问作者luisfer
相关产品推荐
相关产品推荐

