Laravel 画像ファイル upload, updateするときの処理

まずuploadする

パッケージが必要

//パッケージのインストール
sudo apt-get install php-imagick

//laravelで保存領域を確保
php artisan storage:link

画像ファイルの保存処理

store アクション

public function store(Request $request,Material $material)
    {
        $material = new Material();
        if ($request->hasFile('photo')) {
            //  Let's do everything here
            if ($request->file('photo')->isValid()) {
                //
                $validated = $request->validate([
                    'image' => 'mimes:jpeg,png',
                ]);//拡張子extension
                $extension = $request->photo->extension();
                $name = "group-image-".time().".".$extension;
                
                $request->photo->storeAs('/public', $name);
                
                $url = Storage::url($name);
                // $file = File::create([
                //   'name' => $name,
                //     'url' => $url,
                // ]);
                $material->photo =  $url;
              
               
            }
        }
        
        $material->group_id = $request->input('group_id');
        
        $material->main_word = $request->input('main_word');
        
        $material->english = $request->input('english');
        
        $material->japanese = $request->input('japanese');
        
        // $material->photo = $request->input('photo');
        
        $material->save();
        
        $group = Group::find($material -> group_id);
        
        return redirect()->route('material.show',$group);
    }

stackoverflow.com

Controller indexアクション

   public function index(Material $material)
    {
        // $groups = $group->get();
       
       $materials = Material::orderBy('created_at','DESC')->get();
        return view('materials.index',compact('materials'));
    }

UPDATEは、inputタグに enctypeを指定する

//enctypeがないと、コントローラーに送信されない
  <form enctype="multipart/form-data" action="{{ route('material.update',$material) }}" method="POST">
                        @csrf
                        @method('PUT')
                        <div class="card">

multipart/form-dataとは

データをマルチパートデータとして送信します。
フォーム内にファイルの送信欄を配置する場合は、この形式を指定しておく必要があります。

画像データをformで送付するときには必要ということ