多图上传需前端用并加multiple,后端用$request->file('images')遍历处理,验证写'images.*',手动循环调$file->store()而非storeMultiple(),事务确保文件与数据库一致。

多图上传必须用 multiple 属性,后端不能只收 $request->file('image')
浏览器默认把多选文件当做一个数组传,但 Laravel 的 $request->file() 不加索引时只取第一个。如果你没显式处理数组,就只会存一张图。
- 前端
<input type="file" name="images[]" multiple>,注意name带方括号,这是关键 - 后端用
$request->file('images')拿到的是array,不是单个UploadedFile - 别写
$request->file('images')[0]然后循环——直接用foreach ($request->file('images') as $file) - 如果用了 Form Request 验证,
rules()里要写'images.*' => 'required|image|mimes:jpg,jpeg,png',不是'images'
storeMultiple() 不是内置方法,别搜文档白费时间
Laravel 的 Illuminate\Http\UploadedFile 没有 storeMultiple() 这个方法。网上很多教程抄来抄去,实际会报 Call to undefined method storeMultiple()。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 真正能用的是
$file->store('photos')(单个),所以多图得手动 foreach - 想统一路径和命名?先用
$path = 'photos/' . now()->format('Y-m'),再$file->store($path) - 如果启用了
FILESYSTEM_DISK=public,记得跑php artisan storage:link,否则图片 404 - 别在循环里反复调
Storage::disk('public')->put(...),性能差,还绕过UploadedFile->store()的自动重命名和异常处理
相册关联模型时,create() 和 saveMany() 别混用
假设你有 Album 和 Photo 模型,一对多关系。上传完文件,要存数据库记录并关联相册。常见错误是批量创建后手动赋值 album_id,或者用 createMany() 却漏了外键字段。
- 推荐做法:先
$album = Album::create([...]),再$photos = collect($request->file('images'))->map(function ($file) use ($album) { ... })->toArray() - 然后
Photo::insert($photos)(注意是insert,不是createMany),因为createMany不走模型的boot()或访问器 - 如果 Photo 有自定义
getOriginalNameAttribute()这类逻辑,就得用foreach+new Photo()+save() - 事务很重要:
DB::transaction()包住文件存储和数据库插入,不然存一半失败,图片残留、数据库不一致
本地开发用 local 盘,上线切 s3 时路径行为不一致
store() 返回的路径在 local 下是相对路径如 photos/abc.jpg,但在 s3 下是完整 URL(取决于配置)。如果你直接拼接 Storage::url($path),本地没问题,S3 可能返回空或 403。
- 永远用
Storage::url($storedPath)获取可访问链接,不要自己拼asset('storage/'.$path) - 检查
config/filesystems.php里s3的'url'和'endpoint'是否正确,特别是用了 CloudFront 或私有 bucket - 上传前加
if (! $file->isValid()) { ... },有些环境(比如 Docker)临时目录权限不对,isValid()会静默失败 - 大图上传超时?不只是 PHP 的
upload_max_filesize,Nginx 还要调client_max_body_size

















