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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:41:05