Laravel中如何访问Storage/App目录文件?访问异常求助
解决Laravel存储文件无法访问的问题
问题根源
你现在碰到的核心问题是Laravel的storage/app/目录默认不对外网开放,web服务器的可访问根目录是项目里的public/文件夹,所以直接访问storage/app/下的文件必然失败。另外你用Storage::url()生成的路径,默认对应storage/app/public/目录(这个目录需要通过软链接映射到public/storage),但你上传的文件存在storage/app/根目录,导致路径完全不匹配。
解决方案(推荐符合Laravel最佳实践的方式)
1. 调整上传代码,将文件存入storage/app/public/目录
修改你的上传逻辑,指定使用public磁盘(默认对应storage/app/public/路径):
$file = $request->file('cover_image'); $fileName = time().rand(111, 9999).".".$file->getClientOriginalExtension(); // 改用public磁盘存储,文件会被放到storage/app/public/下 Storage::disk('public')->put($fileName, file_get_contents($file));
2. 创建public/storage到storage/app/public的软链接
在项目根目录执行Artisan命令,建立软链接让web服务器能访问到storage/app/public/下的文件:
php artisan storage:link
3. 修改Blade中的图片链接代码
现在Storage::url()可以正确生成对应public/storage/的路径,Blade代码可以简化为:
<img src="{{ Storage::url($article->coverImage) }}" alt="image">
生成的链接会是http://127.0.0.1:8000/storage/15573877669649.jpg,此时就能正常访问图片了。
若必须将文件存在storage/app/根目录(不推荐)
如果因为特殊需求要把文件存在storage/app/,可以通过以下方式处理:
- 自定义磁盘配置:在
config/filesystems.php中添加一个磁盘,指定根目录为storage/app/并配置访问路径,再创建对应软链接; - 写路由处理访问:创建一个路由来读取
storage/app/下的文件并返回响应,但这种方式效率低于软链接,也不符合最佳实践。
举个自定义磁盘的配置示例(修改config/filesystems.php):
'disks' => [ // ...其他磁盘配置 'custom_local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'url' => env('APP_URL').'/storage-app', 'visibility' => 'public', ], ],
之后需要将public/storage-app软链接到storage/app/,不过还是优先推荐前面的最佳实践方案,更简洁安全。
内容的提问来源于stack exchange,提问作者Santanu Biswas
相关产品推荐
相关产品推荐

