やりたいこと
- laravelでユーザーが画像を登録する際に自動的にリサイズして保存される
- データベースとローカルファイルに同時に保存する
- シンボリックリンクを張り画像表示できるようにする
- Intervention Imageを使う
前提
- データベースは作成済み
- Userモデルは定義済み
進めかた
- Intervention Imageのインストール
- Controllerの作成
- viewの作成
- シンボリックリンクを張る
Intervention Imageをインストールする
コマンドでプロジェクトディレクトリに移動してから
$ composer require intervention/image
Laravel構成ファイルconfig/app.phpを開き、次の行を追加します。
config/app.php
'providers' => [
// ~~~~ 省略 ~~~~
Intervention\Image\ImageServiceProvider::class
]
config/app.php
'aliases' => [
// ~~~~ 省略 ~~~~
'Image' => Intervention\Image\Facades\Image::class
]
詳しくはIntervention Imageで。
Controllerの作成
UserController.php
//useを忘れずに
use Intervention\Image\Facades\Image;
public function add(Request $request){
return view('user.add');
}
public function create(Request $request){
//Userモデルに記載した$rulesでvalidateする
$this->validate($request, User::$rules);
$user = new User;
//フォームから送られてきたプロパティをすべて取得し$formに代入
$form = $request->all();
//全てのプロパティを取得すると必要のない_tokenプロパティまで取得してしまうのでunsetメソッドで削除
unset($form['_token']);
//Userモデルをインスタンス化した$userにfill($form)でデータベースに保存
$user->fill($form)->save();
//ファイルのプロパティを取得し$imageに代入
$image = $request->file('user_image');
$width = 500;
//$imageを幅500×縦自動で画像のアスペクト比を保ちながらリサイズしてローカルファイルに保存
Image::make($image)->resize($width, null,function($constraint){$constraint->aspectRatio();})
->save( public_path('/storage/images/'.$form['user_image']));
//ファイル名をユーザーID.jpgにしてデータベースに上書き
$user->fill(['user_image'=>$user->id.'.jpg'])->save();
return redirect('/user');
}
Viewの作成
user.blade.php
<div class="container-fluid">
//ファイルを登録する時はenctype="multipart/form-datを忘れずに
<form action="{{ url('/') }}/user/add" method="post" class="form-horizontal" enctype="multipart/form-data">
@csrf
<div class="form-group">
{{Form::label('user_image','画像:',['class'=>'control-label col-sm-3'])}}
<div class="col-sm-6">
{{Form::file('user_image', old('user_image') ,['class'=>'form-control input-lg'])}}
</div>
</div>
<button type="submit" class="btn btn-primary btn-lg center-block" >登録</button>
</form>
シンボリックリンクを張る
laravelでは基本的にファイルなどは非公開の場所に保存されます(storage/app/public)。
ブラウザからアクセスできるのは基本的に(デフォルトでは)/publicディレクトリです。
そこでWEBに公開できる場所に(ブラウザからアクセスできる)ショートカットできる機能を作成する必要があります。
詳しくはドキュメントで。
コマンドでプロジェクトディレクトリに移動してから
$ php artisan storage:link
以上です