Laravelで画像アップロード機能の実装

早速説明していきます!

開発環境
php 7.4.7
Laravel 7.15.0
MySQL 5.7.29


1、ルートを定義

#web.php

Route::get('/image', 'ImageController@index');
Route::post('/image', 'ImageController@store');


2、画像アップロード用のファイル作成

#ターミナル

$ php artisan make:controller ImageController


続いて作成したControllerを編集していきます。

#app/Http/Controllers/ImageController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ImageController extends Controller
{
    /**
     * プロフィール登録フォームの表示
     *
     * @return Response
     */
    public function index()
    {
        return view('image/index');
    }
}


次にviewファイルにアップロード用のフォームを作成します。

#resources/views/image/index.blade.php

<form method="POST" action="/image" enctype="multipart/form-data" >
    {{ csrf_field() }}
    <input type="file" name="image">
    <input type="submit">
</form>

フォームを利用するときは{{ csrf_field() }}でCSRFトークンの隠しフィールドを生成する必要があります。記述していないとエラーの原因になりますので気をつけましょう。


3、バリデーション

#ターミナル

$php artisan make:request ImageRequest
Request created successfully.


続いて作成したファイルを編集していきます。

#app/Http/Requests/ImageRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ImageRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'image' => 'required|file|image|mimes:jpeg,png,jpg,gif|max:2048'
        ];
    }
}


さらにrulesメソッドにはバリデーションルールを記載します。

#app/Http/Controllers/ImageControllers.php

use App\Http\Requests\ImageRequest;

class ImageController extends Controller
{

    /**
     * 画像の保存
     *
     * @param ImageRequest $request
     * @return Response
     */
    public function store(ImageRequest $request)
    {

    }
}


4、画像ファイルを保存する

今回はローカルのstorageディレクトリにimagesディレクトリを作成し、”(ユーザID).jpg”というファイル名で登録していきます。

#app/Http/Controllers/ImageControllers.php

use Illuminate\Support\Facades\Auth;

class ImageController extends Controller
{
    /**
     * 画像の保存
     *
     * @param ImageRequest $request
     * @return Response
     */
    public function store(ImageRequest $request)
    {

        $request->photo->storeAs('public/images', Auth::id() . '.jpg');

        return redirect('image')->with('success', '新しい画像をを登録しました');
    }
}

5、保存した画像を表示

今のままではstorage/appにアクセスできないので、シンボリックリンクを貼ります。

#ターミナル

$ php artisan storage:link
#app/Http/Controllers/ImageController.php

use Illuminate\Support\Facades\Storage;

class ImageController extends Controller
{
    /**
     * プロフィール登録フォームの表示
     *
     * @return Response
     */
    public function index()
    {
        $is_image = false;
        if (Storage::disk('local')->exists('public/images/' . Auth::id() . '.jpg')) {
            $is_image = true;
        }
        return view('image/index', ['is_image' => $is_image]);
    }
}

画像が表示できるか確認してみましょう。

#resources/views/image/index.blade.php

@if ($is_image)
<figure>
    <img src="/storage/images/{{ Auth::id() }}.jpg" width="150px" height="150px">
    <figcaption>現在のプロフィール画像</figcaption>
</figure>
@endif

保存した画像が表示できましたか?

次回はDBへ画像のpathを保存し、画像を出力する方法について紹介していきます。
本日もご覧いただきましてありがとうございます。
皆様のお役に立てていれば幸いです。