目标
嗨,我正在使用laravel作为RESTful API。 我想向用户返回一个图像文件的URL。 我目前正在使用本地存储,但我已经配置了一个Amazon S3实例,并将我的图像同步到它。 我的目标是通过简单地更改config / filesystems.php中的第一行来在本地存储和s3之间无缝切换:
'default' => 'public',
详情
我已经配置了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',
],
],
这是我的文件夹层次结构:
在本地磁盘上:
在S3上
正如我之前所说,我想通过简单地更改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
哪个甚至不是完整的网址:(我想要返回的内容如下:
http://mywebapp/storage/mobile/profileimages/12345.jpg
但我希望同一个电话同时适用于s3和本地存储,以便我可以无缝切换。
我使用不正确吗?这很令人沮丧,因为这显然是一个库/框架调用,所以我希望它能够工作,或者至少返回一个完整的URL。
谢谢
答案 0 :(得分: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');