0
0

More than 3 years have passed since last update.

Laravel6.x 画像をリサイズしてアップロードする方法

Posted at

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 でプロバイダーとエイリアスに追加する。

config/app.php
'providers' => [
    Intervention\Image\ImageServiceProvider::class, 
],

'aliases' => [ 
     'Image' => Intervention\Image\Facades\Image::class,
],

2.画像アップロード処理

img_nameカラムを追加したのでApp\User.phpで追加したカラムも保存できるよいうに$fillableにカラム名を追記する。

app/User.php
protected $fillable = [
        'name', 'email', 'password', 'img_name',  //img_name追加
];

新規登録の処理が書いてあるapp/Http/Controllers/Auth/RegisterController.phpにアップロード処理を追記する。

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,
        ]);
    }
}

0
0
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
0
0