Laravel – storageに保存したファイルのURL

概要

たとえば保存されたアップロードファイルなど、storageディレクトリー下に保存したファイルのパスを取得する手順を整理する。

  • storage/app/public直下またはそのサブディレクトリー下に保存されたファイルを対象とする
  • artisanにより、storage/app/publicへのシンボリックリンクstoragepublicディレクトリー下に作成
  • publicディレクトリー内は公開されるので、以下のいずれかの方法でURLを取得
    • asset()ヘルパーやurl()ヘルパーの引数に'storage/' . $pathを与えてURLを取得
    • \Storage::url()の引数に$pathを与えてドキュメントルート以下のパスを取得

公開領域

Laravelのファイルの公開場所は以下の様になっている。

  • publicディレクトリー下のファイル、あるいはそのサブディレクトリー下のファイルは公開対象
  • URLでの指定方法は、publicディレクトリー下のディレクトリー・ファイル構成をドメイン名に続けて指定

たとえば以下の例では、publicディレクトリー下にサブディレクトリーtestがあって、その下にbar.txtファイルがある。

このファイルは公開されていて、このアプリケーションをlocalhostで確認する場合、ブラウザーで以下のようなURLを指定するとファイルの内容がブラウザーに表示される。

storage下のファイルの公開

以下のコマンドを実行すると公開領域にシンボリックリンクstorageが作成され、それがstorage/app/publicディレクトリーを指す。

  • publicディレクトリー下にシンボリックリンクstorageが作成される
  • リンクstoragestorage/app/publicを指す
  • ディレクトリー下にアクセスするURLは以下のとおり
    • ドメイン名/storage/....

たとえばアプリケーションがlocalhostで稼働している場合、storage/app/public/foo/bar.pngにアクセスするURLは以下のとおり。

画像ファイルを表示する例

コントローラー

アップロードファイルの保存で保存された画像ファイルを表示させる例を示す。

画像ファイルをフォームで選択してPOSTすると、コントローラーのstoreアクションにルーティングされるとする。

コントローラーの処理は以下の通り。

  1. storeアクションで、フォームリクエストからファイルオブジェクトを取得
  2. 画像ファイル本体をpublicディスクのimagesディレクトリーに保存
  3. その際、ランダム文字列で生成されるファイル名が戻り値となり、これを$pathに保存
  4. $pathを渡してimages.indexビューをレンダリング

ビュー

ページを表示するテンプレートは以下の通り。

ファイル関係の表示は後ろの方で、$pathの内容とasset()url()2つのヘルパーの結果を表示し、ヘルパーで生成されたURLで画像を表示させている。

$pathの内容

画像ファイルを保存した後の$pathの内容は以下の通りで、storeアクションでの処理により、images/ランダム文字列によるファイル名となっている(拡張子はそのまま)。

asset(), url()によるURL

ファイルは公開領域のstorageディレクトリーから参照されるが、そのURLはasset()url()の何れでも同じ結果を与える。

\Storage::url()によるドキュメントルート下のパス

\Storageファサードのurl()メソッドに$pathを指定すると、ドキュメントルート下の画像ファイルのパスが得られる。

img要素のsrcの指定

先のビューでは、asset()url()\Storage::url()の結果をimg要素のsrcの値に指定していて、いずれも同じ画像が表示される。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です