storePubliclyAs 未保存在公用文件夹中

storePubliclyAs not saving in public folder

提问人:Patrick.SE 提问时间:1/11/2018 最后编辑:WreighPatrick.SE 更新时间:1/11/2018 访问量:5397

问:

我不知道我是不是误解了什么,但我在文件上传过程中调用了以下方法:

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

$coverAsset->dir返回并返回经过哈希处理的文件名。businesses/2$coverAsset->preview_name

上传后,我最终在以下位置得到一个文件:storage/app/businesses/1/pre-AxDMVlSN.jpeg

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

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

'disks' => [

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

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

感觉是用磁盘代替磁盘?如何确定方法使用了哪一个?localpublicUploadedFile->storePubliclyAs

维尔·拉拉维尔-5.5

评论


答:

11赞 Wreigh 1/11/2018 #1

基于此的函数:https://github.com/laravel/framework/blob/5.5/src/Illuminate/Http/UploadedFile.php#L61storePubliclyAs

它只是将文件的可见性设置为公共,这与您假设它会将文件移动/存储到公共文件夹中相反。

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

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

根据我所读到的代码,您只需将磁盘名称作为第三个参数传递即可。

所以而不是这个:

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

使用它(我们将使用它,因为您想将其存储在名为 public 的磁盘中):public

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


此外,看看 Laravel 的默认文件系统.phphttps://github.com/laravel/laravel/blob/master/config/filesystems.php#L16

该行在 .env 文件中查找条目,但是,如果未找到条目,它将使用第二个参数;缺省情况下为 .FILESYSTEM_DRIVERlocal

我认为您的配置默认为磁盘。您可以尝试做的是附加到 .env 文件中或将文件系统 .php 中的第二个参数更改为 .localFILESYSTEM_DRIVER=publicpublic

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

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