如何从 Laravel 存储子文件夹中检索文件?

How to retrieve file from Laravel storage subfolder?

我正在尝试从 laravel 项目中的此路径检索文件:

/storage/app/public/blog/3.jpg

这些方法会产生以下错误:

1.

$image = Storage::disk('public')->get('/storage/blog/3.jpg');

->

local.ERROR: File not found at path: storage/blog/3.jpg {"userId":16,"exception":"[object] (Illuminate\Contracts\Filesystem\FileNotFoundException(code: 0): File not found at path: storage/blog/3.jpg at /Users/artur/PhpstormProjects/safa-ameedee.com/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php:171)
[stacktrace]
$image = Storage::disk('public')->get('/storage/app/public/blog/3.jpg');
$image = Storage::get('/storage/app/public/blog/3.jpg');

->

local.ERROR: File not found at path: storage/app/public/blog/3.jpg {"userId":16,"exception":"[object]

奇怪的是我将文件存储在存储中是这样的:

Storage::disk('public')->put('/blog/' . $request->path, $image);

那么它们不应该以相同的方式检索吗?

TL/DR

Storage::disk('public')->get('block/3.jpg');

说明

问题是您出于某种原因将 storage 放在路径中。这不是必需的,并且会导致构建错误的路径。

查看默认文件系统配置:

'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
        'throw' => false,
    ],
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
        'throw' => false,
    ],

root 是有用的,看这里。 storage_path() returns 存储文件夹的完整路径。所以像 storage_path('folder_1') -> /home/user/project/storage/folder_1.

local磁盘是默认的,所以只要Storage::get()就会自动使用它。

您正在使用 public 磁盘,因此这些文件的实际位置是 storage/public(符号链接到 public/storage)。这意味着 Storage::disk('public') 已经从 /home/user/project/storage/app/public 开始了。再次添加storage导致路径不正确。

使用path 可能有助于将来的调试。 Storage::disk('public')->path('block/3.jpg')会输出完整的路径,大家可以看看哪里出错了。对于给定的代码,它可能会显示类似 /home/user/project/storage/app/public/storage/app/public.

的内容