首页 文章

Laravel文件系统/存储 - 本地/公共文件URL不起作用

提问于
浏览
1

Aim

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

'default' => 'public',

Details

我已经配置了laravel来通过config / filesystems.php文件访问本地磁盘和S3 . 根据laravel说明,我将公共/存储软链接到存储/ 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

但我希望 the same call 适用于s3和本地存储,以便我可以无缝切换 .

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

谢谢

1 回答

  • 3

    你可以尝试这样的事情

    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');
    

相关问题