上传文件需设enctype="multipart/form-data"且input name与$request->file()键名一致;store()自动生成路径,storeAs()需手动处理扩展名;存数据库用相对路径,配好磁盘并建软链;验证需后端配合PHP fileinfo扩展。

上传文件前必须检查 enctype 和 name
表单没设 enctype="multipart/form-data",或者 的 name 和控制器里取的键名不一致,$request->file() 就会返回 null。Laravel 5.5 不会报错,只会静默失败。
- 确保表单有
enctype="multipart/form-data"属性 -
→ 控制器里用$request->file('avatar'),不能写成'image'或其他 - 调试时加一句
dd($request->file('avatar')),确认不是null
$request->file()->store() 和 storeAs() 的区别
store() 自动生成路径和文件名(带哈希),适合不需要保留原名的场景;storeAs() 允许指定子目录和文件名,但要注意手动处理扩展名和冲突。
-
$path = $request->file('avatar')->store('uploads');→ 存到storage/app/uploads/xxx.jpg -
$path = $request->file('avatar')->storeAs('avatars', 'user_123.jpg');→ 必须自己拼扩展名,$request->file('avatar')->getClientOriginalExtension()得手动调用 -
store()默认用local驱动,若想存到 public 目录(如public/uploads),需先配置filesystems.php中的public磁盘,并用store('uploads', 'public')
保存路径到数据库时别存 storage/app/ 这种绝对路径
存进数据库的应该是可公开访问的相对路径,比如 uploads/xxx.jpg,而不是 storage/app/uploads/xxx.jpg。否则前端 会 404。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 用
Storage::url($path)生成 URL(前提是磁盘配置了url选项,如public磁盘) - 或直接存相对路径,前端用
{{ asset('storage/' . $user->avatar) }}(需运行php artisan storage:link创建软链) - 如果存的是
store('uploads')返回的路径(如uploads/xxx.jpg),就别再加storage/前缀,否则变成storage/uploads/xxx.jpg,而软链指向的是public/storage→ 实际是public/storage/uploads/xxx.jpg
验证图片类型和大小不能只靠前端
Laravel 5.5 的 mimes:jpeg,jpg,png,gif 规则依赖 finfo 扩展,若服务器没启用,可能绕过校验。同时 max:2048 是 KB 单位,不是 MB。
- 规则写成
'avatar' => 'required|file|mimes:jpeg,jpg,png,gif|max:2048' - 确保 PHP 开启
fileinfo扩展(Ubuntu 下装php-fileinfo包) - 上传大文件还要检查
php.ini的upload_max_filesize和post_max_size,Laravel 层面拦不住超限请求
实际路径处理最易出错的地方在于:存什么、怎么读、怎么配磁盘、怎么建软链,四者必须对得上。少一步,图片就显示不出来。










