c.formvalue("email")返回空字符串最常见原因是前端未正确设置content-type(如fetch漏设headers)、body被c.body()等提前消费,或使用了不支持的格式(如application/json);多值需用c.formvaluemulti()。

c.FormValue() 和 c.FormFile() 就够用了,但必须满足三个前提:Content-Type 正确、body 未被提前消费、CSRF 令牌校验到位。
为什么 c.FormValue("email") 有时返回空字符串
最常见原因是前端没发对请求头或后端误读了 body:
- 前端用
fetch提交表单但漏设headers: { "Content-Type": "application/x-www-form-urlencoded" },浏览器默认发text/plain,Fiber 直接跳过解析 - 手动拼接
multipart/form-data的 boundary 容易出错;务必用FormData对象构造(new FormData(formEl)) - 在调用
c.FormValue()前已执行过c.Body()、c.BodyParser()或c.MultipartForm()—— fasthttp 的 body 只能读一次,之后再取就是空 -
c.FormValue()仅对application/x-www-form-urlencoded和multipart/form-data生效,application/json必须走c.Body()+json.Unmarshal()
多选框/多选下拉框怎么拿到数组
c.FormValue("tags") 永远只返回第一个值,这是新手最常踩的坑。要拿全部选中项,必须用:
-
c.FormValueMulti("tags")(v2.48+)——适用于<select multiple name="tags"></select>或多个<input type="checkbox" name="tags" value="a"> - 确保每个
value唯一且非空;禁用没设value的复选框(否则全提交"on") - 别用
name="tags[]"然后手动strings.Split(c.FormValue("tags[]"), ",")—— 易被恶意输入绕过,也不符合标准表单语义 - 大数组别塞 GET 参数(如
?ids=1,2,3),URL 长度受限且不安全;统一走 POST 表单或 JSON body
上传文件时怎么同时取文本字段和文件
必须用 multipart/form-data,且所有字段(含文本)都应通过 c.MultipartForm() 统一获取:
- 先调
c.ParseMultipartForm(32 (32MB 内存上限),漏掉这步 <code>c.FormFile()和c.FormValue()全部静默失效 -
c.FormValue("title")在 multipart 场景下不可靠;应从form.Value["title"]取(form, _ := c.MultipartForm()) -
c.FormFile("avatar")只返回元数据(*multipart.FileHeader),要读内容得显式调file.Open(),并defer f.Close() - 大文件上传前务必设置
app.Config().BodyLimit和app.Config().MultipartForm.MaxMemory,否则默认 32MB 触发 413 错误
CSRF 校验不是可选项,但 Fiber 不自动拦截
Fiber 的 csrf.New() 中间件默认启用双提交 Cookie 模式,但它不会自动拒绝非法请求,你得手动校验:
- 前端每次提交必须带
X-Csrf-Token头,值来自 Set-Cookie 中的_csrf(不能用 JS 读 HttpOnly Cookie) - 服务端在 handler 里取
c.Get("X-Csrf-Token"),再和c.Locals("csrf_token").(string)对比 - 绕过校验(比如用
c.Next()跳过中间件)等于裸奔,生产环境严禁 - 最容易被忽略的是:
enctype属性必须和后端解析方式严格匹配——text/plain或错误的enctype会导致整个表单解析失败











