【Laravel5.8】登録→確認画面→完了の3段階遷移でfileのsessionを保持したい

Laravel5.8において、

  1. 登録画面から入力してsubmit
  2. 確認画面でOKならsubmit
  3. テーブルにインサート完了・登録!


という3段階遷移でfileのsessionを保持したいパターンがよくあります。


しかし、sessionに

<input type="file" >

のものを保存することは難しい…


そのためCloud9とS3を使用してfileを保存している場合には、

  1. S3の保管用バケットにfileを保管
  2. 確認画面でOKが出たら表示用バケットに保管

というステップが最も簡単なようです。

    public function confirmRequest(Request $request) {
        $this->validate($request, [
            'job_photo' => [
                // 必須
                'required',
                // アップロードされたファイルであること
                'file',
                // 画像ファイルであること
                'image',
                // MIMEタイプを指定
                'mimes:jpeg,png',
                // 最小縦横20px 最大縦横500px
                'dimensions:min_width=20,min_height=20,max_width=500,max_height=500',
            ]
        ]);
        //もし上記のバリデーションに引っ掛からなかったら以下のようにする
        if ($request->file('job_photo')->isValid([])) {
            //S3のjob_photoバケットに保管するパスを作成。なければ自動的にバケットを作ります。
            $path = $request->job_photo->store('job_photo', 's3');
   //上記で定義したpathを使用してpublicへ保管
            Storage::disk('s3')->setVisibility($path, 'public');
            $url = Storage::disk('s3')->url($path);
            //job_photo_urlという名前で$urlをsessionに保存
            $request->session()->put('job_photo_url', $url);
        }else{
            return redirect()->back();  
        }
        
         //file 以外のinputがあればexceptを使用してfileだけ除去
        $job = new Job($request->except(['job_photo']));
        //こちらでjob_photoFILEを保管
        $job->job_photo = $url;
        $request->session()->put('job', $job);

        return view('job.confirmRequest');
    }
    
    public function completeRequest(Request $request) {
  //sessionでjob_photo_urlを定義し、
        $fileUrl = Session::get('job_photo_url');
        $job = $request->session()->get('job');
        $job->user_id = Auth::user()->id;
        //sessionに保管していたjob_photo_urlをテーブルにインサート
        $job->job_photo = $fileUrl;
        $job->save();

        return view('job.completeRequest'));
    }


以上です。