1

目标

嗨,我正在使用 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/存储/移动/背景/
  • myLaravelApp/storage/mobile/closetimages/
  • myLaravelApp/storage/mobile/profileimages/

在 S3 上

  • mybucket/手机/背景/
  • mybucket/手机/closetimages/
  • mybucket/手机/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。

谢谢

4

1 回答 1

4

你可以试试这样的

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');
于 2016-05-04T04:33:32.737 回答