必须先调用 r.parsemultipartform() 才能使用 r.formfile(),否则返回空或 panic;iris 基于 net/http,需显式解析 multipart 数据,未解析时 formfile 和 multipartreader 均不可用。

Iris 框架本身不内置文件上传解析器,必须手动调用 r.ParseMultipartForm(),否则 r.FormFile() 会返回空或 panic。这是最常踩的坑——很多人直接写 r.FormFile("files") 就报错。
✅ 必须先 ParseMultipartForm 才能取文件
Iris 使用标准 net/http 的底层逻辑,所有 multipart 数据都得显式解析。没这步,FormFile 和 MultipartReader 都不可用。
r.ParseMultipartForm(10 中的数值是最大内存缓存(单位字节),超出会暂存到磁盘;设太小(如 1MB)可能让大图直接失败- 若不确定大小,可设为
32 (32MB),再配合 Nginx/Apache 的 <code>client_max_body_size限制做兜底 - 解析失败时,
err != nil且通常带"http: request body too large",需提前拦截并返回 413
⚠️ 多图上传不能只用 FormFile("file")
r.FormFile("file") 只取第一个匹配 name 的文件,永远只返回单个 multipart.File。多图必须用 r.MultipartReader() 或遍历 r.MultipartForm.File map。
- 正确做法:先
r.ParseMultipartForm(),再访问r.MultipartForm.File["images"](假设前端name="images") - 该字段是
[]*multipart.FileHeader类型,每个元素对应一个选中的文件 - 注意:如果前端用了
name="images[]",Iris 不会自动转成数组;它只认原始 name 字符串,所以后端必须用"images[]"去查 map
? 文件保存路径必须提前存在
Iris 不会自动创建目录层级,os.OpenFile("./uploads/2026/09/", ...) 如果父目录不存在,os.OpenFile 直接返回 error。
- 推荐用
os.MkdirAll("./uploads/2026/09/", 0755)在保存前确保路径就绪 - 不要硬编码相对路径,应从配置读取根上传目录,比如
app.Config().GetString("upload.dir") - 文件名建议重命名(如 UUID + ext),避免用户上传
../../etc/passwd.jpg导致路径穿越;handler.Filename是客户端传来的原始名,不可信
真正麻烦的不是接收,而是错误处理粒度——Iris 没有类似 multer 的中间件式校验,每张图的类型、大小、是否为空,都得手动循环检查并聚合错误信息。这点容易被忽略,结果就是上传 5 张图,只报第一张错了,其余静默失败。











