storePublicly没有保存在公用文件夹中

时间:2018-01-10 22:54:37

标签: laravel laravel-5.5

我不知道我是否误解了某些内容,但在上传文件时我会调用以下方法:

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name);

$coverAsset->dir返回businesses/2$coverAsset->preview_name返回散列文件名。

完成上传后,我最终获得了一个文件: storage/app/businesses/1/pre-AxDMVlSN.jpeg

我很困惑,为什么文件没有保存在storage/app/public/businesses/...中?我希望公开'部分将它放在Laravel提供的存储目录结构的公共文件夹中。

我查看了我的文件系统配置:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

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

感觉好像使用了local磁盘而不是public磁盘?如何找出UploadedFile->storePubliclyAs方法使用的是哪一个?

1 个答案:

答案 0 :(得分:2)

功能storePubliclyAs基于此:https://github.com/laravel/framework/blob/5.5/src/Illuminate/Http/UploadedFile.php#L61

它只是将文件的可见性设置为公开,这与您假设它将移动/存储文件相反进入公用文件夹

实际选择要存储的磁盘。只需使用storePubliclyAs $options参数的第三个可选参数。

请注意,如果您没有选择磁盘(通过传递$ options参数),Laravel将使用基于您的filesystems.php配置文件的默认选定磁盘。

根据我读过的有关代码的内容,您只需将磁盘名称作为第三个参数传递。

所以不要这样:

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name);

使用此功能(我们将使用public,因为您希望将其存储在名为 public 的磁盘中):

$cover->storePubliclyAs($coverAsset->dir, $coverAsset->preview_name, 'public');

此外,请查看Laravel的默认 filesystems.php https://github.com/laravel/laravel/blob/master/config/filesystems.php#L16

该行在 .env 文件中查找FILESYSTEM_DRIVER条目,但是如果它没有找到,则会使用第二个参数;默认情况下为local

我认为您的配置默认为local磁盘。您可以尝试将FILESYSTEM_DRIVER=public附加到 .env 文件中,或将 filesystems.php 中的第二个参数更改为public

如果有任何错误,请告诉我,因为我还没有尝试过这方面的任何内容,我只是阅读了代码。

如果您想自己跟踪代码,可以在此处查找:https://github.com/laravel/framework/blob/5.5/src/Illuminate/Http/UploadedFile.php