Auth
の認証機能で作成された新ユーザー登録に画像のアップロード機能を追加していきます。画像アップロード処理はIntervention Image
ライブラリを使用して画像をリサイズして保存する方法をやっていきます。
画像保存するにあたってusersテーブルにimg_nameカラムを追加する
Intervention Imageについて
実装環境
- PHP 7.3
- Laravel 6.20.26
1.Intervention Imageをインストール
まずはライブラリをcomposerを使用してインストール
$ composer require intervention/image
次に config/app.php
でプロバイダーとエイリアスに追加する。
'providers' => [
Intervention\Image\ImageServiceProvider::class,
],
'aliases' => [
'Image' => Intervention\Image\Facades\Image::class,
],
2.画像アップロード処理
img_nameカラムを追加したのでApp\User.php
で追加したカラムも保存できるよいうに$fillable
にカラム名を追記する。
protected $fillable = [
'name', 'email', 'password', 'img_name', //img_name追加
];
新規登録の処理が書いてあるapp/Http/Controllers/Auth/RegisterController.php
にアップロード処理を追記する。
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\Facades\Image; //Intervention Imageライブラリ:追記
class RegisterController extends Controller
{
use RegistersUsers;
protected $redirectTo = RouteServiceProvider::HOME;
public function __construct()
{
$this->middleware('guest');
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'],
]);
}
protected function create(array $data)
{
if (isset($data['img_name'])) {
$img_file = $data['img_name'];
//画像がアップロードされたのか確認
if ($img_file->isValid()) {
//画像の拡張子取得
$extension = $img_file->extension();
//ファイル名作成
$img_name = uniqid(mt_rand()) . '.' . $extension;
//画像を編集して、保存
$img = Image::make($img_file->getRealPath());
$img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name);
} else {
$img_name = '';
}
} else {
$img_name = '';
}
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'img_name' => $img_name,
]);
}
}
解説
validatorメソッドに画像のバリデーション追記。
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'],
]);
}
createメソッドに画像をリサイズして保存する処理を追記。
Laravelは画像のアップロードした際/storage/app/public
配下にファイルが保存されるようになっているので、/storage/app/public
配下にimagesディレクトリを作成してそこに保存するよいうにする。
また、サイトのページに公開する際はpublicフォルダ
が読み込まれるのでpublicフォルダ
内に画像ファイルがなくてはいけない。
/storage/app/public
からpublic
にシンボリックリンクを作成することで画像表示できるよいうになる。
php artisan storage:linkをコマンドプロンプトで実行する。
protected function create(array $data)
{
if (isset($data['img_name'])) {
$img_file = $data['img_name'];
//画像がアップロードされたのか確認
if ($img_file->isValid()) {
//画像の拡張子取得
$extension = $img_file->extension();
//ファイル名作成
$img_name = uniqid(mt_rand()) . '.' . $extension;
//画像を編集して、保存
$img = Image::make($img_file->getRealPath());
$img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name);
} else {
$img_name = '';
}
} else {
$img_name = '';
}
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'img_name' => $img_name,
]);
}
}