Laravel 8上传图片到公共目录时为何文件名自动加密而非保留原名?
问题原因说明
Laravel 的 UploadedFile::store() 方法默认会自动生成40位长度的随机哈希字符串作为存储文件名,这是框架的默认设计,目的是避免不同用户上传的同名文件互相覆盖。
你当前的代码还存在两个额外问题:
- 参数顺序错误:
store()方法第一个参数是存储目录,第二个参数才是磁盘标识,你当前调用store('public/uploads/blog/thumb')时没有指定磁盘,文件实际被存在了默认磁盘(通常为local)下的public/uploads/blog/thumb目录,并非你预期的可web访问的public磁盘 - 路径不匹配:数据库存储的是
getClientOriginalName()获取的用户上传原始文件名,但磁盘实际存储的是随机哈希命名的文件,两者完全无法对应,后续根本无法通过数据库记录定位到真实文件。
解决方案
根据你的需求,可选择以下任意一种写法:
方案1:使用用户上传的原始文件名存储文件
注意:直接使用原始文件名存在重名覆盖、特殊字符导致路径异常的风险,生产环境建议给文件名加时间戳/唯一ID避免冲突。
使用storeAs()方法自定义存储文件名,同时明确指定public磁盘:
public function store(Request $request) { if ($request->isMethod('post')) { $validatedImage = $request->validate([ 'thumb' => 'required|image|mimes:jpg,png,jpeg,gif,svg|max:2048', ]); // 获取用户上传的原始文件名 $originalFileName = $request->file('thumb')->getClientOriginalName(); // 可选:添加时间戳避免重名,取消下一行注释即可 // $originalFileName = time() . '_' . $originalFileName; // 存储文件,返回相对public磁盘的真实路径 $storedRealPath = $request->file('thumb')->storeAs( 'uploads/blog/thumb', // 相对public磁盘的存储目录 $originalFileName, // 自定义的文件名 'public' // 明确指定使用public磁盘 ); Posts::create([ 'thumb' => $storedRealPath, // 存储真实的文件路径而非原始文件名 'name' => $request->input('name'), 'description' => $request->input('description') ]); return redirect('/blog/posts')->with('success', 'Post Cadastrado'); } }
方案2:保留框架默认的随机哈希文件名(生产环境推荐)
随机文件名可以有效避免路径遍历、文件覆盖等安全风险,只需要修正磁盘参数和数据库存储的内容即可:
public function store(Request $request) { if ($request->isMethod('post')) { $validatedImage = $request->validate([ 'thumb' => 'required|image|mimes:jpg,png,jpeg,gif,svg|max:2048', ]); // 明确指定第二个参数为public磁盘,返回相对public磁盘的真实路径 $storedRealPath = $request->file('thumb')->store('uploads/blog/thumb', 'public'); Posts::create([ 'thumb' => $storedRealPath, // 存储真实的文件路径 'name' => $request->input('name'), 'description' => $request->input('description') ]); return redirect('/blog/posts')->with('success', 'Post Cadastrado'); } }
前置操作提醒:如果需要通过web直接访问
public磁盘下的文件,必须先在项目根目录执行php artisan storage:link命令,创建public目录到storage/app/public目录的软链接,否则文件无法被外部访问。
内容的提问来源于stack exchange,提问作者Alef Felipe
相关产品推荐
相关产品推荐

