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

Laravel中如何将图片文件名存入数据库并移除public/image/前缀

解决方法

先调整代码执行顺序,优先验证上传文件再执行上传操作,避免无效文件占用服务器空间;同时从返回的路径中提取纯哈希文件名存入数据库:

public function avatarUpload(Request $request)
{
    // 先验证上传文件的合法性
    $validator = Validator::make($request->all(), [
        'image' => 'required|image|mimes:jpeg,png,jpg,svg|max:5000'
    ]);

    if ($validator->fails()) {
        // 根据业务需求返回错误,示例为JSON格式错误响应
        return response()->json(['error' => $validator->errors()], 400);
    }

    // 获取当前登录用户
    $data = UserModel::where('app_id', Session::get('loginId'))->first();
    
    // 上传文件到指定目录
    $path = $request->file('image')->store('public/image');
    
    // 从完整路径中提取哈希后的纯文件名
    $filename = basename($path);

    // 更新数据库字段
    $data->update([
        'photo_filename' => $filename
    ]);

    return $filename;
}

关键修改说明:

  • 验证逻辑前置:原代码先上传再验证,会导致不符合规则的文件也被存储,调整后先验证通过再执行上传,避免资源浪费。
  • 修正验证字段名:原规则里的photo_filename是错误的,上传的表单字段名是image,所以验证规则要对应修改。
  • 提取纯文件名:使用PHP原生函数basename($path),直接截取完整路径的最后一段,比如路径为public/image/abc123xyz.jpg时,会返回abc123xyz.jpg。

可选替代方案:

如果想用Laravel内置的文件工具类提取文件名,也可以这样写:

use Illuminate\Support\Facades\File;

// 提取带后缀的完整文件名
$filename = File::basename($path);
// 仅提取不带后缀的文件名(如果需要)
$filenameWithoutExt = File::name($path);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:05:15