You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:51:12