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