0

目指すLaravelファイルシステム/ストレージ - 公共/ローカルファイルのURLが

こんにちは動作していないが、私はRESTfulなAPIのためlaravelを使用しています。 ユーザーにイメージファイルへのURLを返したいと思います。 私は現在ローカルストレージを使用していますが、Amazon S3インスタンスを設定して、自分のイメージをそこに同期しました。 私の目的は、シームレスに、単に私のconfig/filesystems.phpの最初の行を変更することにより、ローカルストレージとS3の間で切り替えることです:私は、ローカルディスクの両方にアクセスするためのlaravelを設定している

'default' => 'public', 

詳細

S3はconfig/filesystems.phpファイルを使用します。 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 /記憶/モバイル/ closetimages/
  • myLaravelApp /記憶/モバイル/ profileimages/
  • S3

    • mybucket /モバイル/背景/
    • mybucket /モバイル/ closetimages/
    • mybucket /モバイル/ profileimages/

    で3210

先ほど述べたように、私は希望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です。でも、完全なURLではありませんがjpg

:(私は何を返したいことのようなものです:

http://mywebapp/storage/mobile/profileimages/12345.jpg

しかし、私はS3とローカルの両方のストレージのために働くこと同じコールをしたいと思いますこれは明らかに、ライブラリ/フレームワークの呼び出しであるため、それはイライラ私はシームレスに切り替えることができますように。

は私が間違ってそれを使用しています?私はそれが動作するように期待される、または少なくとも完全なURLを返すように。

あなたが

答えて

2

あなたはこれが見事に見えるこの

$assetUrl = public_url('mobile/profileimages/12345.jpg'); 
+0

のようにそれを使用することができ、この

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); } 

ような何かを試すことができますありがとうございます。グローバル関数として多かれ少なかろうとしているので、Laravelプロジェクト内にこの関数をどこに置いて広くアクセスできるようにするかについて、あなたは何か推奨をお願いします。ありがとう – mils

+0

私はそれが助けてうれしいです。私は単にそれをapp/helpers.phpファイルに入れます。この方法でOKなら、あなたの 'composer.json'の' 'autoload'セクションに' 'app/helpers.php" ''ファイルを追加することで自動ロードすることを忘れないでください。 – peterm

関連する問題