【问题标题】:Laravel Filesystem/Storage - Local/Public File URLs Not WorkingLaravel 文件系统/存储 - 本地/公共文件 URL 不起作用
【发布时间】:2016-08-29 07:26:36
【问题描述】:

瞄准

您好,我正在使用 laravel 作为 RESTful API。 我想向用户返回图像文件的 URL。 我目前正在使用本地存储,但我已经配置了一个 Amazon S3 实例,并将我的图像同步到它。 我的目标是通过简单地更改我的 config/filesystems.php 中的第一行来在本地存储和 s3 之间无缝切换:

'default' => 'public',

详情

我已将 laravel 配置为通过 config/filesystems.php 文件访问本地磁盘和 S3。 根据 laravel 的说明,我将 public/storage 软链接到 storage/app/public。 这是我的 config/filesystems.php 中的磁盘数组:

    'disks' => [

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

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

        's3' => [
            'driver'    => 's3',
            'key'       => '...',
            'secret'    => '...',
            'region'    => '...',
            'bucket'    => 'mybucket',
        ],
    ],

这是我的文件夹层次结构:

在本地磁盘上:

  • myLaravelApp/storage/mobile/backgrounds/
  • myLaravelApp/storage/mobile/closetimages/
  • myLaravelApp/storage/mobile/profileimages/

在 S3 上

  • mybucket/mobile/backgrounds/
  • mybucket/mobile/closetimages/
  • mybucket/mobile/profileimages/

正如我之前所说,我想通过简单地更改我的 config/filesystems.php 中的第一行来在本地存储和 s3 之间无缝切换:

'default' => 'public',

我希望使用以下函数调用将数据返回给用户:

return Storage::url('mobile/profileimages/12345.jpg');

当我使用 s3 作为默认调用时,响应是这样的:

https://s3.amazonaws.com/mybucket/mobile/profileimages/12345.jpg

这太棒了!但是,当我使用默认本地存储进行此调用时,响应是:

/storage/mobile/profileimages/12345.jpg

这甚至不是一个完整的 URL :( 我想返回的是这样的:

http://mywebapp/storage/mobile/profileimages/12345.jpg

但我希望 同一个调用同时适用于 s3 和本地存储,以便我可以无缝切换。

我是不是用错了?这很令人沮丧,因为这显然是一个库/框架调用,所以我希望它能够工作,或者至少返回一个完整的 URL。

谢谢

【问题讨论】:

    标签: laravel amazon-web-services amazon-s3 laravel-filesystem


    【解决方案1】:

    你可以试试这样的

    function public_url($path = '')
    {
        $fs = app('filesystem');
    
        if ($fs->getDriver()->getAdapter() instanceof \League\Flysystem\Adapter\Local) {
            return asset($fs->url($path));
        }
    
        return $fs->url($path);
    }
    

    你可以这样使用它

    $assetUrl = public_url('mobile/profileimages/12345.jpg');
    

    【讨论】:

    • 这看起来很棒。您对在我的 laravel 项目中放置这个函数的位置有什么建议,以使其广泛可访问,因为它似乎或多或少是一个全局函数。谢谢
    • 我很高兴它有帮助。我只是把它放在 app/helpers.php 文件中。如果您对这种方法没问题,请不要忘记通过将"files": [ "app/helpers.php" ] 添加到composer.jsonautoload 部分来自动加载它。
    猜你喜欢
    • 2017-10-03
    • 2021-09-08
    • 2017-10-11
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多