Laravel8上传图片入库仅存目录路径无文件名问题解决
问题根因
你的代码有3个核心错误,直接导致图片路径存错、访问失败:
- 给模型
image字段赋值时用了$request->input('image'),上传文件不能通过input()方法取值,且你后续在文件上传判断逻辑里生成的$image_path根本没有赋值给模型字段,等于存库的一直是空/错误值 - 图片实际存储位置是
public/images目录,但前端渲染时用的是/storage/images路径,路径不匹配 - 表单
action属性为空、提交按钮的class属性拼写错误,属于次要问题,不影响核心逻辑但建议修正
分步修复方案
1. 修正控制器赋值逻辑
你现在的代码里,就算文件上传成功移动到了目录,也没把生成的带文件名的路径存到模型里,把控制器代码改成下面这样:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Restaurant; class RestaurantController extends Controller { function add(Request $request) { // 先加表单验证,避免空提交 $validated = $request->validate([ 'name' => 'required', 'email' => 'required|email', 'address' => 'required', 'create_at' => 'required|date', 'uploaded_at' => 'required|date', 'image' => 'required|image|mimes:jpg,jpeg,png,gif|max:2048', // 限制图片格式大小 ]); $resto = new Restaurant; $resto->name = $request->input('name'); $resto->email = $request->input('email'); $resto->address = $request->input('address'); $resto->create_at = $request->input('create_at'); $resto->uploaded_at = $request->input('uploaded_at'); // 处理图片上传 if($request->hasFile('image')) { $image = $request->file('image'); // 不建议用原文件名,重名会覆盖,这里加个唯一前缀 $image_name = time().'_'.$image->getClientOriginalName(); $image->move(public_path('images'), $image_name); // 把生成的完整路径赋值给模型image字段,这步你之前漏了 $resto->image = "/images/" . $image_name; } $resto->save(); $request->session()->flash('status', '提交成功'); return redirect()->route('list'); // 这里改成你的列表页命名路由更稳妥 } }
注意:如果坚持要用原文件名,直接去掉time().'_'前缀即可,但非常不推荐,同名文件上传会直接覆盖旧文件。
2. 修正前端渲染路径
你现在图片存在public/images目录,对应的访问路径应该是http://127.0.0.1:8000/images/文件名,不要用/storage前缀。/storage前缀是用来访问storage/app/public目录下文件的,需要执行软链命令才能用,如果你想改用storage存储,执行下面的命令:
php artisan storage:link
然后上传代码改成$path = $request->file('image')->store('images', 'public');,存库的路径拼接/storage/前缀,就能得到你预期的http://127.0.0.1:8000/storage/images/具体图片文件名格式。
3. 修正表单代码
把表单的action补全,修正按钮的class拼写错误:
<form method="POST" action="{{ route('add') }}" enctype="multipart/form-data"> @csrf <!-- 其他表单项保持不变 --> <button type="Submit" class="btn btn-primary">Submit</button> </form>
关于$request->all()中image为空对象的排查
如果改完代码还是出现这个问题,按顺序检查:
- 检查
php.ini配置,确保upload_max_filesize、post_max_size值大于你上传的图片大小,修改后重启php服务 - 确认表单已经加了
enctype="multipart/form-data"属性,你现在的代码里是加了的,这步没问题 - 检查图片文件名是否有特殊字符,导致上传失败
内容的提问来源于stack exchange,提问作者UNKNOWN
相关产品推荐
相关产品推荐

