2016-05-04 121 views
0

目的Laravel文件系统/存储 - 本地/公共文件的URL不工作

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

'default' => 'public', 

详细

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

正如我刚才所说,我会喜欢在本地存储和s3之间进行无缝切换,只需更改config/filesystems.php中的第一行:

'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。

谢谢

回答

2

你可以尝试这样的

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

这看起来辉煌。你有什么建议将这个功能放在我的laravel项目中,以便使它可以广泛访问,因为它看起来或多或少是全局功能。谢谢 – mils

+0

我很高兴它帮助。我只是把它放在app/helpers.php文件中。如果你确定使用这种方法,不要忘记通过在你的'composer.json'的''autoload''部分添加''files':[“app/helpers.php”]来自动加载它。 – peterm

相关问题