应使用 c.formvaluemulti("tags") 读取多选数据,它返回 []string;若用 name="tags[]" 需手动拆分,但不推荐;须确保 value 唯一非空,禁用未设 value 的复选框;避免 get 传大数组,优先 post 表单或 json;解析 json 前需校验 content-type 并限制 body 大小。

如何用 c.FormValue 正确读取多选下拉框或复选框数组
直接调用 c.FormValue("tags") 只能拿到第一个选中项,不是数组——这是 Fiber 新手最常踩的坑。Fiber 的 FormValue 本质是 url.Values.Get 的封装,只返回单值。要读多选数据,必须用 c.FormValueMulti(v2.48+)或手动解析 c.Body()。
-
c.FormValueMulti("tags")返回[]string,适用于name="tags"的<select multiple></select>或多个同名<input type="checkbox" name="tags"> - 若用
name="tags[]"(带方括号),Fiber 默认不自动识别为数组;后端需自己按strings.Split(c.FormValue("tags[]"), ",")拆分——但这种方式易被恶意输入破坏,不推荐 - 确保前端提交的是
application/x-www-form-urlencoded或multipart/form-data,application/json需走c.Body()+json.Unmarshal
复选框数组提交时 value 必须唯一且非空
如果多个 <input type="checkbox" name="role"> 的 value 全是空字符串或重复值(如都写 value="1"),c.FormValueMulti("role") 会返回空数组或错误去重结果。
- 每个
value应为业务唯一标识,比如数据库 ID、UUID 或语义化字符串("admin","editor") - 禁止省略
value:没设value的复选框默认提交"on",所有项都变成相同字符串,无法区分 - 不要依赖
id或data-属性传值——表单提交只发name+value对
处理带过滤/分页的多选场景时,别在路由参数里塞数组
有人把选中的 ID 列表拼成 /api/users?ids=1,2,3,4 再用 c.Queries("ids") 拆分,这在多选数量大时会触发 URL 长度限制(通常 2KB 左右),且 GET 不适合敏感或大量数据。
- 坚持用 POST + 表单提交,或 POST + JSON body:
{"user_ids": ["u_abc", "u_def"]} - 若必须用查询参数,改用多次
id=1&id=2&id=3格式,再用c.QueryParser().Parse(c.Request().URI())提取重复键 - Fiber 不内置对
id[]=1&id[]=2的自动解析,得自己遍历c.Request().URI().Query()并过滤 key 匹配id\[\]
从 c.Body() 解析 JSON 多选数据要防 panic
当前端用 fetch 发 JSON,后端用 c.Body() 读取时,容易忽略两个关键点:body 只能读一次,且未检查 Content-Type 就直接 json.Unmarshal 会 panic。
- 先确认
c.Get("Content-Type")包含"application/json",否则跳过 JSON 解析逻辑 - 用
io.LimitReader(c.Body(), 1024*1024)限制最大读取 1MB,防恶意大 payload - 定义结构体字段用指针或
omitempty,避免空数组被忽略:Roles *[]string `json:"roles,omitempty"`
c.FormValueMulti 返回空,而错误日志里只显示“no data”,看不出是哪一环断了。











