Laravel 8实现可选文件上传,解决getClientOriginalName()空对象调用错误
解决Laravel可选文件上传时的「Call to a member function getClientOriginalName() on null」错误
错误根源是未上传文件时,$request->fotoone或$request->fototwo为null,直接调用getClientOriginalName()会触发方法调用错误。以下是针对storeproduk和updateproduk方法的修复方案:
一、修复storeproduk方法
核心修改点:
- 启用文件字段的可选验证规则(
nullable) - 先判断文件是否存在,再执行文件操作
- 动态赋值数据库字段,未上传时存
null
public function storeproduk(Request $request) { $this->validate($request, [ 'anggota_id' => 'required', 'produk_unggulan' => 'required', 'sosial' => 'required', 'lingkungan' => 'required', // 启用可选文件验证:允许为空,限制格式和大小 'fotoone' => 'nullable|mimes:jpeg,png,jpg|max:3048', 'fototwo' => 'nullable|mimes:jpeg,png,jpg|max:3048', ], $messages = [ 'anggota_id.required' => 'Nama Anggota Tidak Boleh Kosong dan Wajib Diisi', 'produk_unggulan.required' => 'Produk Unggulan Tidak Boleh Kosong dan Wajib Diisi', 'sosial.required' => 'Kemanfaatan Sosial Tidak Boleh Kosong dan Wajib Diisi', 'lingkungan.required' => 'Kemanfaatan Lingkungan Tidak Boleh Kosong dan Wajib Di isi', 'fotoone.mimes' => 'Foto #1 harus berformat jpeg/png/jpg', 'fotoone.max' => 'Foto #1 tidak boleh lebih dari 3MB', 'fototwo.mimes' => 'Foto #2 harus berformat jpeg/png/jpg', 'fototwo.max' => 'Foto #2 tidak boleh lebih dari 3MB', ]); // 初始化文件名变量 $namaFile = null; $namaFile2 = null; // 处理第一张图片:先判断是否上传了文件 if ($request->hasFile('fotoone')) { $nm = $request->fotoone; $namaFile = $nm->getClientOriginalName(); $nm->move(public_path() . '/img', $namaFile); } // 处理第二张图片 if ($request->hasFile('fototwo')) { $nm2 = $request->fototwo; $namaFile2 = $nm2->getClientOriginalName(); $nm2->move(public_path() . '/img', $namaFile2); } // 创建数据时动态赋值文件字段 $data = Produk::create([ 'anggota_id' => $request->anggota_id, 'produk_unggulan' => $request->produk_unggulan, 'jenis_sayur' => $request->jenis_sayur, 'nama_sayur' => $request->nama_sayur, 'kg_sayur' => $request->kg_sayur, 'total_sayur' => $request->total_sayur, 'jenis_buah' => $request->jenis_buah, 'nama_buah' => $request->nama_buah, 'kg_buah' => $request->kg_buah, 'total_buah' => $request->total_buah, 'jenis_ikan' => $request->jenis_ikan, 'nama_ikan' => $request->nama_ikan, 'kg_ikan' => $request->kg_ikan, 'total_ikan' => $request->total_ikan, 'jenis_ternak' => $request->jenis_ternak, 'nama_ternak' => $request->nama_ternak, 'kg_ternak' => $request->kg_ternak, 'total_ternak' => $request->total_ternak, 'sosial' => $request->sosial, 'lingkungan' => $request->lingkungan, 'fotoone' => $namaFile, 'fototwo' => $namaFile2, ]); return redirect('/dashboard/produk')->with('success', 'Data Berhasil Ditambahkan!'); }
二、修复updateproduk方法
核心修改点:
- 移除文件字段的
required验证,改为nullable - 判断是否上传新文件,有则替换旧文件,无则保留原数据
- 避免对
null调用move()方法
public function updateproduk(Request $request, $id) { $this->validate($request, [ // 改为可选验证 'fotoone' => 'nullable|mimes:jpeg,png,jpg|max:3048', 'fototwo' => 'nullable|mimes:jpeg,png,jpg|max:3048', ], $messages = [ 'fotoone.mimes' => 'Foto #1 harus berformat jpeg/png/jpg', 'fotoone.max' => 'Foto #1 tidak boleh lebih dari 3MB', 'fototwo.mimes' => 'Foto #2 harus berformat jpeg/png/jpg', 'fototwo.max' => 'Foto #2 tidak boleh lebih dari 3MB', ]); $dats = Produk::find($id); // 保留原文件名 $awal = $dats->fotoone; $awal2 = $dats->fototwo; // 处理第一张新图片 if ($request->hasFile('fotoone')) { $nm = $request->fotoone; $awal = $nm->getClientOriginalName(); $nm->move(public_path() . '/img', $awal); } // 处理第二张新图片 if ($request->hasFile('fototwo')) { $nm2 = $request->fototwo; $awal2 = $nm2->getClientOriginalName(); $nm2->move(public_path() . '/img', $awal2); } // 更新数据 $dats->update([ 'produk_unggulan' => $request['produk_unggulan'], 'nama_sayur' => $request['nama_sayur'], 'kg_sayur' => $request['kg_sayur'], 'total_sayur' => $request['total_sayur'], 'nama_buah' => $request['nama_buah'], 'kg_buah' => $request['kg_buah'], 'total_buah' => $request['total_buah'], 'nama_ikan' => $request['nama_ikan'], 'kg_ikan' => $request['kg_ikan'], 'total_ikan' => $request['total_ikan'], 'nama_ternak' => $request['nama_ternak'], 'kg_ternak' => $request['kg_ternak'], 'total_ternak' => $request['total_ternak'], 'sosial' => $request['sosial'], 'lingkungan' => $request['lingkungan'], 'fotoone' => $awal, 'fototwo' => $awal2, ]); return redirect('/dashboard/produk')->with('success', 'Data Berhasil Di Update!'); }
三、视图优化(可选)
打开错误提示注释,方便用户看到文件验证错误:
<div class="form-group"> <label for="fotoone">Foto Produk #1</label> @error('fotoone') <div class="alert alert-danger">{{ $message }}</div> @enderror <input type="file" id="fotoone" name="fotoone" class="form-control"> </div> <div class="form-group"> <label for="fototwo">Foto Produk #2</label> @error('fototwo') <div class="alert alert-danger">{{ $message }}</div> @enderror <input type="file" id="fototwo" name="fototwo" class="form-control"> </div>
内容的提问来源于stack exchange,提问作者gtprow
相关产品推荐
相关产品推荐

