Laravel 6表单添加文件上传功能遇阻:文件未存入数据库与目录
Laravel 6 文件上传故障排查与修复
问题根源分析
你的代码存在几个关键问题,导致文件既不保存也不写入数据库:
- 前端表单大概率缺少文件上传必需的
enctype="multipart/form-data"属性,服务器无法接收上传文件 - 文件存储路径错误,使用了不符合Laravel规范的路径
- 对单个文件名进行不必要的JSON编码,可能导致数据库存储异常
- 目标存储目录可能缺少写入权限
修复步骤
1. 修正前端表单
确保表单标签添加 enctype 属性,否则无法上传文件:
<form method="POST" action="{{ route('karieri.store') }}" enctype="multipart/form-data"> <!-- 表单输入项 --> </form>
2. 调整文件存储逻辑
替换Controller中文件上传部分的代码,修正路径并去掉多余的JSON编码:
if ($request->hasFile('cv')) { $file = $request->file('cv'); // 生成唯一文件名 $name = time() . '.' . $file->getClientOriginalExtension(); // 存储到Laravel默认的公共存储目录(storage/app/public) $file->storeAs('public', $name); // 直接存储文件名,无需JSON编码 $karieri->cv = $name; }
如果偏好使用move方法,路径需改为:
$file->move(storage_path('app/public'), $name);
3. 创建存储符号链接
在终端运行命令,将storage/app/public映射到public/storage,确保前端可直接访问文件:
php artisan storage:link
4. 检查目录权限
确保存储目录有写入权限,Linux服务器执行:
chmod -R 755 storage/ chown -R www-data:www-data storage/
5. 验证数据库字段
确认cv字段为VARCHAR类型(建议长度255),足以存储文件名。
优化后的完整Controller代码
public function store(Request $request) { $request->validate([ 'names' => 'required', 'age' => 'required', 'last_rab' => 'required', 'last_pos' => 'required', 'phone' => 'required', 'cv' => 'required|mimes:doc,docx,pdf,txt|max:2048', 'msg' => 'required' ]); if ($request->captcha != 58) { return redirect()->back()->withInput()->with('warning', 'Wrong'); } $karieri = new Karieri; $karieri->age = $request->age; $karieri->last_rab = $request->last_rab; $karieri->names = $request->names; $karieri->email = $request->email; $karieri->phone = $request->phone; $karieri->last_pos = $request->last_pos; if ($request->hasFile('cv')) { $file = $request->file('cv'); $name = time() . '.' . $file->getClientOriginalExtension(); $file->storeAs('public', $name); $karieri->cv = $name; } $karieri->msg = $request->msg; $karieri->status = 0; $karieri->save(); return redirect()->back()->with('success', 'Thanks'); }
文件访问方式
后续展示或下载文件时,用asset()生成访问URL:
// 假设$karieri为数据库取出的模型实例 $cvUrl = asset('storage/' . $karieri->cv);
内容的提问来源于stack exchange,提问作者Bozhidar Iliev
相关产品推荐
相关产品推荐

