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

Laravel自定义图标无法更新至数据库问题求助

链接自定义图标上传后文件名无法更新至数据库

我已经实现了用户头像上传功能,但复制该代码为用户链接添加自定义图标上传时,遇到了上传图标文件名无法写入数据库的问题。

正常工作的头像上传代码(UserController)

public function update_avatar(Request $request){

    if($request->hasFile('avatar')){
        $avatar = $request->file('avatar');
        $filename = time() . '.' . $avatar->getClientOriginalExtension();
        Image::make($avatar)->fit(300, 300)->save( public_path('/uploads/avatars/' . $filename ) );

        $user = Auth::user();
        $user->avatar = $filename;
        $user->save();
    }

    return redirect()->back()
        ->with(['success' => 'Profile picture updated!']);

}

失败的自定义图标上传代码(LinkController)

public function custom_icon(Request $request){

    if($request->hasFile('icon')){
        $icon = $request->file('icon');
        $filename = time() . '.' . $icon->getClientOriginalExtension();
        Image::make($icon)->fit(300, 300)->save( public_path('/img/icons/' . $filename ) );

        $icon->icon = $filename;
        $icon->save();
    }

    return redirect()->back()
        ->with(['success' => 'Custom icon uploaded!']);

}

路由配置片段(web.php)

Route::group(['middleware' => 'auth', 'prefix' => 'dashboard', ], function() {

    Route::get('/links', [LinkController::class, 'index']);
    Route::get('/links/new', [LinkController::class, 'create'])->middleware('verified');
    Route::post('/links/new', [LinkController::class, 'store']);
    Route::get('/links/{link}', [LinkController::class, 'edit']);
    Route::post('/links/{link}', [LinkController::class, 'update']);
    Route::delete('/links/{link}', [LinkController::class, 'destroy']);
    Route::post('/links/{link}', [LinkController::class, 'custom_icon']);

    // 其他路由省略...
});

问题修复方案

1. 修正模型实例操作错误

你错误地将上传的文件对象$icon当作了Link模型实例来操作,这是核心问题。需要通过路由注入获取对应的Link模型:

public function custom_icon(Request $request, Link $link){ // 注入Link模型实例

    if($request->hasFile('icon')){
        $iconFile = $request->file('icon'); // 变量名区分文件和模型
        $filename = time() . '.' . $iconFile->getClientOriginalExtension();
        Image::make($iconFile)->fit(300, 300)->save( public_path('/img/icons/' . $filename ) );

        $link->icon = $filename; // 操作Link模型字段
        $link->save();
    }

    return redirect()->back()
        ->with(['success' => 'Custom icon uploaded!']);

}

2. 解决路由冲突

你定义了两个相同URL和请求方式的路由,Laravel会优先匹配先定义的update方法,导致custom_icon永远无法触发。修改路由为:

// 替换原冲突路由
Route::post('/links/{link}/custom-icon', [LinkController::class, 'custom_icon']);

同时前端表单的提交地址需要对应调整为/dashboard/links/{{ $link->id }}/custom-icon。

3. 可选:添加文件验证规则

为了避免无效文件上传,建议在方法开头添加验证逻辑:

public function custom_icon(Request $request, Link $link){
    $request->validate([
        'icon' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', // 可根据需求调整规则
    ]);

    // 后续上传逻辑...
}

内容的提问来源于stack exchange,提问作者caktasnino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:35:25