2016-05-04 103 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

相關問題