Laravelで画像をUploadして、表示させる方法

Laravelで画像をUPLOADして、表示させる方法を紹介します。
今回は、POSTで画像をUploadしていきます。
・画像のUpload方法
・画像の表示方法
を紹介していきます。

画像をUploadするための流れを解説

・formを利用して、画像をUpload
・UploadするファイルのPathをデータベースへ保存

formを利用して、画像をUpload

まずは、formを利用して画像をUploadします。
formで、Uploadされた画像は、storageの配下にUPされます。

View____________________

<form method="POST" action="/imageUpload" enctype="multipart/form-data">
{{ csrf_field() }}
<input type="file" id="file" name="profile" class="form">
<button type="submit">アップロード</button>
</form> 

ポイント;
・input type=”file”
・enctype=”multipart/form-data

ファイルアップロードをする場合input要素はを使い、その親のform要素には以下のようにenctype=”multipart/form-data”と書く必要があります。

ROUTE____________________

Route::post('/imageUpload', 'mypageContactController@imageUpload') 

ポイント;
・formのactionが、postで指定するアクション内容となる。

UploadするファイルのPathをデータベースへ保存

Uploadされた画像を呼び出すために、Uploadする画像のPath名称を設定して、そのPathをデータベースに登録する必要があります。

$file_name = time() . '.' . request()->file->getClientOriginalName();
// fileの名称を決定します。
// Uniqueになっていることが重要なので、time()を接頭に追記

$request->file('file')->storeAs('public',$file_name);
// storageは以下のpublicディレクションに、 $file_name で保存



//ここからは、データベースにファイルがUpされているPathを保存
$imagepath = '/storage/' . $file_name;


$loginId = Auth::id();
$profileInfo = User::find($loginId);
//Modelを活用

$profileInfo->imagepath = $imagepath;
// imagepathをデータベースへ保存
$profileInfo->save();

return redirect()->action(
'mypageContactController@profile'
); 

パス名が public/xxxxxxxxxx.jpg となるので不要な public/ の部分を削除しています。

画像を表示するための流れを解説

・シンボリックリンクの作成
・<img src=”path名称”>に、pathを代入する

シンボリックリンクの作成

Laravelは、publicディレクトリ配下に存在するファイルしか、表示することができません。しかし、アップロードしたファイルは/storage/appの下にあるためアクセスすることができません。
/publicディレクトリと/storage/appディレクトリとの間でリンクを持たせる必要があります。
それを実行してくれるのが、シンボリックリンクです。

やり方は、いたってシンプルです。
コマンドで下記を実行してください。

 $ php artisan storage:link 

画像を表示させる<img src=”path名称”>に、pathを代入する

あとは、画像を表示させたい場所で、保存したPathを呼び出してあげればよいです。上記で、App\Model\User {{ imagepath }} のカラムへ、Pathをデータベースへ保存しました。

Viewで下記を呼び出してあげればOKです。
※ただし、Viewで呼び出すために、Controllerから、profileInfo(Userのデータ)をView側へcompactで送ってあげることが前提です。

@if(isset( $profileInfo->imagepath ))
<img src="{{$profileInfo->imagepath}}">     
@else
@endif   

コメントを残す

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