You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8实现可选文件上传,解决getClientOriginalName()空对象调用错误

解决Laravel可选文件上传时的「Call to a member function getClientOriginalName() on null」错误

错误根源是未上传文件时,$request->fotoone或$request->fototwo为null,直接调用getClientOriginalName()会触发方法调用错误。以下是针对storeproduk和updateproduk方法的修复方案:


一、修复storeproduk方法

核心修改点:

  1. 启用文件字段的可选验证规则(nullable)
  2. 先判断文件是否存在,再执行文件操作
  3. 动态赋值数据库字段,未上传时存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方法

核心修改点:

  1. 移除文件字段的required验证,改为nullable
  2. 判断是否上传新文件,有则替换旧文件,无则保留原数据
  3. 避免对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:27:25