1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】storageにある画像が読みだせない

Posted at

###要約

  1. php artisan storage:link
  2. storeAs('public', ファイル名)
  3. {{ asset('/storage/ファイル名') }}で読み出す

###画像をアップロードするフォームを作成していたら、画像が読みだせない

***Controller.php
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を保存して、データベースから画像を取得する流れと勉強します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?