###要約
- php artisan storage:link
- storeAs('public', ファイル名)
- {{ asset('/storage/ファイル名') }}で読み出す
###画像をアップロードするフォームを作成していたら、画像が読みだせない
public function (Request $request){
$uploaded_image = $request->file('image');
if($request->hasFile('image') && $uploaded_image->isValid(){
$file_name = $uploaded_image->getClientOriginalName();
$uploaded_image->storeAs('characters', $file_name); // ここが原因でassetで読み込めなくなる
}
}
#####storeAs('characters', $filename)
storage/app/characters
の中に$filename
という名前で保存する
という意味になる。
つまり、storage/app/public
には入っていないということ!!ここが肝心!!
###シンボリックリンクを作成しないとstorageディレクトリにアクセスできない
そもそもLaravelのルートディレクトリはcss
,js
などを入れるディレクトリになっていて、実際公開されているのはこのディレクトリだけ。
ということはstorageディレクトリに入っている画像はアクセスできないから読みだせないじゃん!どうしよ・・・
###シンボリックリンクで参照されるディレクトリはstorage/app/public
とうことでルートのpublicディレクトリに、storageにアクセスするシンボリックリンクを作成する。
Windowsでいうショートカット
に当たる。
(もともとWindowsしか使ったことないから、この考え方超わかりやすい)
// publicにstorageにアクセスするためのシンボリックリンクを作成する
$ php artisan storage:link
これで
public/storage(←ショートカット)
ディレクトリが作成される。
Windowsでいうと、publicの中のstorageリンクをクリックするとstorage/app/public
フォルダに飛ぶということ。
###画像の保存先をstorage/app/publicにしてassetヘルパを使う
assetヘルパはルートディレクトリのパスを生成してくれるもの?(言葉は変かも知れません。)
asset('panda.jpg')ならpublic/panda.jpgというパスを生成してくれる。
ということは
<img src="{{ asset('panda.img') }}">
// public/panda.imgを参照することになる!そこには画像がないにも関わらず!
// 逆にpublicに直接画像を入れれば読み出せる。
{{ asset('/storage/panda.img') }}
// publicの中のシンボリックリンクstorageの中のpanda.imgを参照
// シンボリックリンクstorageはstorage/app/publicに飛ぶ
// 結局,public/storage→storage/app/publicの中のpanda.imgにアクセス
ということは
// php artisan storage:linkを実行した後なら
<img src="{{ asset('storage/panda.img') }}">
これで画像が読み出せる!!
###シンボリックリンクの参照先の変更もできるらしい
これは勉強不足で良く理解できていません。
###storeAsの使い方
$uploaded_image->storeAs('characters', $file_name);
// storage/app/charactersディレクトリに$file_nameというファイル名で保存
これだとstorage/app/publicとちゃうんやんってなってassetで読みだせない
$uploaded_image->storeAs('public', $file_name);
// storage/app/public
これでasset('storage/ファイル名')で読み出せる!
###storeだとフォルダ名とファイル名が思わぬことに
$uploaded_image->store($file_name);
これだと
storage/appの中に$file_nameのディレクトリを作成してそのなかに謎の文字列が並んだファイル名で保存される。
###感想
少しずつLaravelのディレクトリ構成が分かってきた。
でもまだまだ分かっていないのが分かった。無知の知的な。
これからデータベースにPathを保存して、データベースから画像を取得する流れと勉強します。