beego中接收post表单数据需用getstring("key")或parseform(&struct),确保字段导出、带form标签且类型匹配;文件上传须设enctype="multipart/form-data"并调用getfile()和savetofile();启用csrf时模板需嵌入{{.xsrfdata}}。

Beego 中如何接收 POST 表单数据
Beego 默认不自动解析 application/x-www-form-urlencoded 以外的表单数据,如果前端用 fetch 或 axios 发送 JSON,this.Input().Get() 会拿不到值——这是最常踩的坑。
正确做法是:确保前端提交的是标准表单编码格式,后端用 this.Input().Get() 或 this.GetString() 获取字段:
func (c *MainController) Post() {
username := c.GetString("username") // 自动 trim,空时返回空字符串
age := c.GetString("age")
// 注意:GetString 不做类型转换,age 是 string,需手动转 int
}
-
GetString("field")安全,未提交时返回空字符串,不会 panic -
this.Input().Get("field")效果类似,但更底层,一般推荐GetString - 若字段名含点号(如
user.name),Beego 默认不支持嵌套解析,需前端改名或手动解析this.Ctx.Input.RequestBody
Beego 表单绑定结构体时要注意什么
用 c.ParseForm(&u) 绑定结构体看似方便,但容易因标签、字段可见性或类型不匹配静默失败。
常见问题:字段没被赋值,但也不报错。原因通常是:
- 结构体字段未导出(首字母小写),Beego 无法反射设置
- 缺少
form标签,或标签名和表单 key 对不上 - 字段类型与表单值不兼容(比如表单传
"abc"到int字段)
示例:
type User struct {
Name string `form:"username"` // 必须大写 + form 标签匹配表单 name
Age int `form:"age"`
}
func (c *MainController) Post() {
var u User
if err := c.ParseForm(&u); err != nil {
c.Data["json"] = map[string]interface{}{"error": err.Error()}
c.ServeJSON()
return
}
// u.Name, u.Age 现在才有效
}
Beego 中处理文件上传表单
普通表单提交加文件,必须把 enctype 改成 multipart/form-data,否则 c.GetFile() 拿不到文件。
关键点:
-
c.GetFile("upload")返回multipart.File和*multipart.FileHeader,不是文件路径 - 必须调用
c.SaveToFile()才真正写入磁盘,且目标路径需存在、有写权限 - Beego 默认限制单个请求最大 64MB,超限会直接返回 400,可通过
MaxMemory和MaxUploadSize配置调整
示例:
func (c *MainController) Post() { title := c.GetString("title") f, h, err := c.GetFile("upload") if err != nil { c.Ctx.Output.SetStatus(400) return } defer f.Close() c.SaveToFile("upload", "./uploads/"+h.Filename) // 第二个参数是相对 web 目录的保存路径 }CSRF 保护开启后表单提交失败怎么办
Beego 启用 EnableCsrf = true 后,所有非 GET/HEAD 请求都会校验 _csrf 值,漏传或过期都会 403。
解决方法:
- 模板中用
{{.xsrfdata}}输出隐藏域:<input type="hidden" name="_csrf" value="{{.xsrfdata}}"> - API 场景下(如 Vue/React 单页),需先 GET
/csrftoken接口获取 token,并在后续请求 header 中带X-CSRF-Token - 注意 cookie 的
SameSite设置,跨域提交时可能因浏览器策略丢掉 cookie,导致 token 不匹配
这个环节没有错误提示,只返回 403,很容易误判为路由或权限问题。











