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方法,跨环境部署时容易出现路径解析错误。
修复方案
- 修改store方法中create方法的logo字段赋值,把
$request->logo替换为提前生成的$logo变量 - 用
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
相关产品推荐
相关产品推荐

