Laravel 画像アップロード
inputタグを使うけども、ファイルかどうかを確認するバリデーションを設定
画像サイズは統一にした方がレイアウトが綺麗になる(例えば、1920px✖️1080px)
- ユーザー側でリサイズするパターン
- 1920px✖️1080pでないとアップロードできないというバリデーションをつける
- サーバー側でリサイズするパターン
- PHPに搭載される「Intervention Image」を使う
重複しない名前で保存する
//ビュー側
<form method=“post” action=“” enctype=“multipart/form-data”>
<input type=“file” accept=“image/png,image/jpeg,image/jpg”>
ここからは大体お約束の事柄
formのところはmultipart属性をつける
accept属性でアップロードできるファイルを指定できる
画像の保存 putFileを使うとフォルダも作ってくれる
//画像アップロード コントローラ側
//リサイズしないパターン (putFileでファイル名生成)
use Illuminate\Support\Facades\Storage;
public function update(Request $request, $id) {
$imageFile = $request->image; //PC側に一時保存
if(!is_null($imageFile) && $imageFile->isValid() ){//画像があって、かつアップロードできたら(isValid)
//第一引数:保存したいフォルダ 第二引数:保存したいファイルを指定
Storage::putFile('public/shops', $imageFile); }
}
Intervention Imageを使った画像保存
PHP 画像ライブラリ http://image.intervention.io/
注意
(もし無効になっていたら有効化する(enableにする) php.info()で確認)
GD 画像ライブラリをコンポーザーで入れる
composer require intervention/image
Intervention Image 設定
config/app.php
$providers = [ Intervention\Image\ImageServiceProvider::class];
// Imageだとバッティングするので変更 aliasに追加
$alias = ['InterventionImage' => Intervention\Image\Facades\Image::class ];
Intervention Image リサイズ
use InterventionImage;
$resizedImage = InterventionImage::make($imageFile)->resize(1920, 1080)->encode();
//Storage::putFile はFileオブジェクト想定 InterventionImageでリサイズすると画像になり型が変わる
//今回は Storage:put で保存 (フォルダは作成、ファイル名は指定)
//InterventionImage::make でInterventionImageで画像を使えるようにする
$fileName = uniqid(rand().'_');//ファイル名を一意にする
$extension = $imageFile->extension(); //拡張子を取得する
$fileNameToStore = $fileName. '.' . $extension;//文字列連結
Storage::put('public/shops/' . $fileNameToStore, $resizedImage );