Laravel 9图片上传后数据库存储tmp路径问题求助
Laravel 9 图片上传问题:数据库存储临时文件路径而非自定义文件名
问题详情
首次使用Laravel 9,需实现以下功能:上传图片到服务器public/image文件夹,将自定义文件名存入数据库,最后在视图中展示图片。目前图片已成功按自定义名称保存到目标文件夹,但数据库中存储的是临时文件路径(如D:\xampp\tmp\php5819.tmp),需解决该问题。
控制器代码
public function create() { $student = Student::all(); return view('create', ['addstudent' => $student]); } public function save(Request $request) { $newName = ''; if ($request->file('image')) { $extension = $request->file('image')->getClientOriginalExtension(); $newName = $request->name . '-' . now()->timestamp . '.' . $extension; $request->file('image')->storeAs('image', $newName, 'public'); } $request['image'] = $newName; $student = Student::create($request->all()); if ($student) { session()->flash('success', 'Data berhasil ditambahkan'); session()->flash('pesan', 'Data berhasil ditambahkan'); } return redirect('/about'); // dd($request->all()); }
图片展示视图代码
@extends('layouts.templates') @section('title', 'Detail') @section('content') <div class="container"> <div class="row"> <h1>Student Detail</h1> <div class="my-3"> <img src="{{asset('image'.$student->image)}}" alt="{{ $student->name}}"> </div> <h3>Nama : {{$student->name}}</h3> <h3>Gender : @if ($student->gender == 'P') Perempuan @else Laki - laki @endif</h3> <h3>NIM : {{$student->NIM}}</h3> <a href="/about">Back</a> </div> </div> @endsection
表单代码
@extends('layouts.templates') @section('title', 'Add Student') @section('content') <div class="container"> <div class="row"> <div class="col-8 m-auto"> <h2 class="my-3">Form Add Student</h2> <form action="save" method="post" enctype="multipart/form-data"> @csrf <div class="form-group"> <label for="name">Nama </label> <input name="name" type="text" class="form-control" id="name" aria-describedby="emailHelp" placeholder="Masukkan Nama" required> </div> <div class="form-group"> <label for="gender">Gender</label> <select name="gender" id="gender" class="form-control" required> <option value="">Pilih</option> <option value="L">L</option> <option value="P">P</option> </select> </div> <div class="form-group mb-3"> <label for="NIM">NIM</label> <input name="NIM" type="text" class="form-control" id="NIM" placeholder="Masukkan NIM"> </div> <label for="NIM">Image</label> <div class="input-group mb-3"> <input type="file" class="form-control" id="image" name="image" aria-describedby="inputGroupFileAddon04" aria-label="Upload"> </div> <div class="form-group row"> <div class="col-sm-10 mb-5"> <button type="submit" class="btn btn-primary">Add</button> </div> </div> </form> <a href="/about">Back</a> </div> </div> </div> @endsection
问题分析与解决方案
问题核心:$request->all()会优先读取原始的image字段(即临时文件对象),直接修改$request['image']无法覆盖原始数据,导致数据库存入临时路径。
解决方法1:用merge修改请求数据
将控制器中$request['image'] = $newName;替换为:
$request->merge(['image' => $newName]);
merge方法会正确更新请求的输入集合,后续$request->all()会包含修改后的自定义文件名。
解决方法2:手动构建数据数组
放弃$request->all(),手动筛选字段并创建数据:
$student = Student::create([ 'name' => $request->name, 'gender' => $request->gender, 'NIM' => $request->NIM, 'image' => $newName ]);
这种方式更安全,能避免请求中未预期字段的干扰,同时确保image字段使用自定义值。
额外优化:修复视图图片路径
当前视图中asset('image'.$student->image)缺少斜杠,会导致路径错误,修改为:
<img src="{{asset('image/'.$student->image)}}" alt="{{ $student->name}}">
内容的提问来源于stack exchange,提问作者namarahasia
相关产品推荐
相关产品推荐

