使用Fiber的Context时如何遍历请求中的多个上传文件?
遍历multipart上传请求中所有文件的实现方法
你使用的c.FormFile是框架对Go标准库上传方法的封装,框架本身没有提供直接返回全量上传文件列表的API,可以直接操作请求底层的MultipartForm结构遍历所有文件,不需要提前知晓文件名或表单字段名。
实现逻辑
- 首先调用
ParseMultipartForm方法完成multipart表单解析,传入参数为允许表单占用的最大内存(超出部分会自动写入临时文件) - 解析完成后,所有上传文件会存储在
c.Request.MultipartForm.File结构中,这是一个map[string][]*multipart.FileHeader类型的集合,key为前端上传时使用的表单字段名,value为对应字段下的所有文件头切片 - 两层遍历即可拿到所有上传的文件对象,做后续校验、存储等处理
代码示例
const maxMemory = 32 << 20 // 限制表单最大占用内存为32MB // 1. 解析multipart表单 if err := c.Request.ParseMultipartForm(maxMemory); err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, map[string]string{"msg": "表单解析失败"}) return } // 2. 遍历所有上传文件 for formField, fileList := range c.Request.MultipartForm.File { for _, fileHeader := range fileList { // 读取文件基础信息 fileName := fileHeader.Filename fileSize := fileHeader.Size contentType := fileHeader.Header.Get("Content-Type") // 打开文件获取内容流 fileStream, err := fileHeader.Open() if err != nil { // 处理文件打开异常,跳过当前文件即可 continue } defer fileStream.Close() // 此处编写自定义业务逻辑,比如文件格式校验、存储到本地/对象存储等 } }
注意事项
- 必须先执行
ParseMultipartForm完成解析,直接访问c.Request.MultipartForm会得到空值 - 即使前端使用同一个表单字段上传多文件(比如开启multiple属性的文件选择框),也能通过对应字段的文件切片拿到全部文件
- 遍历过程中如果需要提前终止处理,记得及时关闭已打开的文件流避免资源泄漏
内容的提问来源于stack exchange,提问作者granitdev
相关产品推荐
相关产品推荐

