Laravel Filesystem/Storage - Local/Public 文件 URL 无效
Laravel Filesystem/Storage - Local/Public File URLs Not Working
目标
您好,我正在使用 laravel 作为 RESTful API。
我想 return 用户一个 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 数据给用户:
return Storage::url('mobile/profileimages/12345.jpg');
当我使用默认的 s3 进行此调用时,响应如下:
https://s3.amazonaws.com/mybucket/mobile/profileimages/12345.jpg
太棒了!但是,当我使用默认本地存储进行此调用时,响应是:
/storage/mobile/profileimages/12345.jpg
这甚至不是一个完整的 URL :( 我想要 return 是这样的:
http://mywebapp/storage/mobile/profileimages/12345.jpg
但我希望同一个调用同时适用于 s3 和本地存储,以便我可以无缝切换。
我是不是用错了?这很令人沮丧,因为这显然是一个 library/framework 调用,所以我希望它能工作,或者至少 return 一个完整的 URL。
谢谢
你可以试试这个
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 作为 RESTful API。 我想 return 用户一个 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 数据给用户:
return Storage::url('mobile/profileimages/12345.jpg');
当我使用默认的 s3 进行此调用时,响应如下:
https://s3.amazonaws.com/mybucket/mobile/profileimages/12345.jpg
太棒了!但是,当我使用默认本地存储进行此调用时,响应是:
/storage/mobile/profileimages/12345.jpg
这甚至不是一个完整的 URL :( 我想要 return 是这样的:
http://mywebapp/storage/mobile/profileimages/12345.jpg
但我希望同一个调用同时适用于 s3 和本地存储,以便我可以无缝切换。
我是不是用错了?这很令人沮丧,因为这显然是一个 library/framework 调用,所以我希望它能工作,或者至少 return 一个完整的 URL。
谢谢
你可以试试这个
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');