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

Laravel store上传图片 数据库存为XAMPP临时tmp路径问题求解

Laravel store方法上传图片存临时路径问题

问题现象

  • 调用store方法实现图片上传时,提示操作成功,数据可正常写入数据库
  • 数据库中logo字段存储的始终是c:\xampp\tmp\php3e93.tmp这类PHP临时文件路径
  • 代码中已编写将上传文件移动到public/image/admin/bank目录的逻辑,但store方法中该逻辑未达到预期效果
  • update方法使用完全相同的文件移动、路径赋值逻辑,可正常将public目录下的目标文件路径存入数据库

相关代码

控制器代码(BankController)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\AdminBank;
use RealRashid\SweetAlert\Facades\Alert;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth;

class BankController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $banks = AdminBank::select('id','logo', 'bankName', 'type', 'noRekening', 'created_at')->get();
        return view('admin.bank.index', compact('banks'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|max:50',
            'logo' => 'required|mimes:jpg,jpeg,png',
            'type' => 'required',
            'noRekening' => 'required' ,
        ]);

        $logo = time().'-'.$request->logo->getClientOriginalName();
        $request->logo->move('image\admin\bank', $logo);

        AdminBank::create([
            'bankName' => $request->name,
            'logo' => $request->logo,
            'type' => $request->type,
            'noRekening' => $request->noRekening,
        ]);

        Alert::success('Success', 'Data berhasil ditambahkan');

        return redirect(route('bank.index'));
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $banks = AdminBank::select('id','logo', 'bankName', 'noRekening', 'created_at')->find($id);
        // $banks = AdminBank::whereId('')->first();
        return view('admin.bank.edit', compact('banks'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required|max:50',
            'logo' => 'mimes:jpg,jpeg,png',
            'noRekening' => 'required' ,

        ]);

        $data = [
            'bankName' => $request->name,
            'type' => $request->type,
            'noRekening' => $request->noRekening,
        ];

        $banks = AdminBank::whereId($id)->first();

        if($request->logo){

            File::delete('image/admin/bank/'. $banks->logo);

            $logo =  time().'-'.$request->logo->getClientOriginalName();
            $request->logo->move('image\admin\bank', $logo);

            $data['logo'] = $logo;
        }

        $banks->update($data);

        Alert::success('Success', 'Data berhasil diperbaharui');

        return redirect()->route('bank.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function confirm($id)
    {
        alert()->question('Perhatian!','Apa kamu yakin ingin menghapus?')
        ->showConfirmButton('<a href="/admin-foresell/list/bank/' . $id . '/delete" class="text-white" style="text-decoration: none"> Delete</a>', '#3085d6')->toHtml()
        ->showCancelButton('Cancel', '#aaa')->reverseButtons();

        return redirect('/admin-foresell/list/bank');
    }

    public function delete($id)
    {
        $bank = AdminBank::whereId($id)->firstOrFail();
        File::delete('image/admin/bank/'. $bank->logo);
        $bank->delete();

        Alert::success('Success', 'Data berhasil dihapus');

        return redirect('/admin-foresell/list/bank');
    }

}

上传视图表单代码

<div class="modal fade" id="modal-daftar" tabindex="-1" role="dialog" aria-labelledby="modal-notification"
        aria-hidden="true">
        <div class="modal-dialog modal-default modal-dialog-centered " role="document">
            <div class="modal-content">

                <div class="modal-header">
                    <h6 class="modal-title" id="modal-title-notification">Your attention is required</h6>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">×</span>
                    </button>
                </div>

                <div class="modal-body">

                    <form action="{{ Route('bank.store') }}" method="POST" enctype="multipart/form-data">
                        @csrf
                      

                        {{-- Name --}}
                        <div class="mb-3">
                            <label for="name" class="form-label">Name</label>
                            <input type="text" class="form-control" id="name" name="name"
                                value="{{ old('name') }}">
                            @error('name')
                                <p class="text-danger">{{ $message }}</p>
                            @enderror
                        </div>

                        {{-- TYPE --}}
                        <div class="form-group mb-3">
                            <label for="tipe" class="form-label ">Type</label>
                            <select name="type" id="" class="form-control form-select">
                                <option value="bank">Bank</option>
                                <option value="gopay">Gopay</option>
                                <option value="ovo">Ovo</option>
                            </select>
                            @error('type')
                                <p class="text-danger">{{ $message }}</p>
                            @enderror
                        </div>

                        {{-- logo --}}
                        <div class="mb-3">
                            <label for="logo" class="form-label ">Logo</label>
                            <input type="file" class="form-control" id="logo" name="logo">
                            @error('logo')
                                <p class="text-danger">{{ $message }}</p>
                            @enderror
                        </div>

                        {{-- Rekening --}}
                        <div class="form-group mb-3">
                            <label for="noRekening" class="form-label">No ( rekening / gopay / ovo)</label>
                            <input type="text" class="form-control" name="noRekening" id="">
                            @error('noRekening')
                                <p class="text-danger">{{ $message }}</p>
                            @enderror
                        </div>

                        <button type="submit" class="btn btn-primary">Tambah</button>
                    </form>
                </div>
            </div>
        </div>
</div>

问题截图

数据库存储临时路径错误截图

故障原因

核心错误在store方法的数据库赋值逻辑:

  • 代码中虽然生成了重命名后的$logo文件名,也执行了文件移动操作,但调用AdminBank::create()写入数据库时,传入的是$request->logo,这个值是Laravel的上传文件实例对象,直接写入数据库时会被自动转为字符串,输出的就是PHP临时文件的存储路径。
  • update方法之所以正常,是因为该方法里是把重命名后的$logo变量赋值给了$data['logo'],存入数据库的是正确的目标文件名,和store方法的赋值逻辑本质上不一样。
  • 额外隐患:代码中文件路径使用Windows专属的反斜杠\,且使用相对路径调用move方法,跨环境部署时容易出现路径解析错误。

修复方案

  1. 修改store方法中create方法的logo字段赋值,把$request->logo替换为提前生成的$logo变量
  2. 用public_path()辅助函数拼接文件存储的绝对路径,统一路径分隔符为正斜杠/,兼容不同操作系统

修复后的store方法代码如下:

public function store(Request $request)
{
    $request->validate([
        'name' => 'required|max:50',
        'logo' => 'required|mimes:jpg,jpeg,png',
        'type' => 'required',
        'noRekening' => 'required' ,
    ]);

    $logo = time().'-'.$request->logo->getClientOriginalName();
    // 用public_path获取public目录绝对路径,统一用正斜杠做分隔符
    $request->logo->move(public_path('image/admin/bank'), $logo);

    AdminBank::create([
        'bankName' => $request->name,
        'logo' => $logo, // 修正此处赋值,传入生成的目标文件名
        'type' => $request->type,
        'noRekening' => $request->noRekening,
    ]);

    Alert::success('Success', 'Data berhasil ditambahkan');

    return redirect(route('bank.index'));
}

内容的提问来源于stack exchange,提问作者baihaqi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:45:46