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
相关产品推荐
相关产品推荐

