Buffalo 的 c.Bind 不支持 multipart 表单自动绑定,非文件字段需手动通过 c.Request().FormValue("name") 获取,或先调用 c.Request().ParseMultipartForm(32

Buffalo 的 c.Bind 不支持 multipart 文件字段自动提取
直接用 c.Bind(&u) 绑定含文件的表单,u 里所有字段(包括普通文本)都会为空——这不是结构体标签写错了,而是 Buffalo 默认不解析 multipart/form-data 中的非文件字段。它只把文件部分交给后续 handler 处理,其余表单值得手动取。
必须显式调用 c.Request().FormValue("name") 拿文本字段,或改用 c.Request().ParseMultipartForm(32 预解析整个 body,否则 FormValue 返回空字符串。
- 默认不调用
ParseMultipartForm,FormValue就不可靠 - 解析前需设最大内存限制(如
32 表示 32MB),超限会报http: request body too large - 文件本身通过
c.Request().MultipartForm.File["file"]获取,不是结构体字段
文件上传路由必须显式注册,不能依赖自动绑定
Buffalo 没有类似 Express + Multer 的声明式中间件链,app.Post("/upload", uploadHandler) 这种写法里,uploadHandler 必须自己完成:解析 multipart、校验文件、保存到磁盘/DB、返回响应。
常见错误是把上传逻辑写在普通 handler 里却忘了 ParseMultipartForm,结果 MultipartForm 为 nil,File 字段 panic。
- 路由定义就写
app.Post("/upload", UploadHandler),别加任何“中间件”参数 - handler 开头第一行必须是
c.Request().ParseMultipartForm(32 - 检查错误:
if err != nil && err != http.ErrNotMultipart才真出错;http.ErrNotMultipart表示没发 multipart,可返回 400
保存上传文件要用 os.Create + io.Copy,别碰 c.SaveUploadedFile
Buffalo v1 没有 c.SaveUploadedFile 方法(那是 Gin 或 Echo 的 API),强行调用会编译失败。文件保存必须走标准 Go 流程:打开目标路径的 *os.File,再用 io.Copy 把 file.Header.Open() 返回的 io.ReadCloser 写进去。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
漏关文件句柄会导致磁盘满或 “too many open files” 错误;路径未做 filepath.Join 拼接可能被目录遍历攻击利用。
- 用
os.MkdirAll("uploads", 0755)确保目录存在 - 文件名必须用
securefilename.SecureFilename(file.Filename)处理,防止../../etc/passwd类路径穿越 -
defer src.Close()和defer dst.Close()都不能少
Postman 测试时 Content-Type 不能手动填
在 Postman 里选 form-data 类型后,**不要**在 Headers 里手动设 Content-Type: multipart/form-data——这会导致 Buffalo 解析失败,报 http: no such file 或空文件列表。Postman 会自动生成带正确 boundary 的 header,手动覆盖就破坏了协议格式。
Key 值必须和后端代码里 MultipartForm.File["avatar"] 的 key 完全一致,大小写敏感;传多个文件就用相同 key 多次添加。
- 测试时只填 Body → form-data → Key=avatar, Type=File, Value=选文件
- 额外文本字段也放 form-data 里,Type=Text,Key 匹配
FormValue("email") - 如果后端收不到文件,先看 Postman 是否弹出 “boundary missing” 提示
实际上传逻辑没有魔法,就是标准 Go 的 http.Request 操作。Buffalo 只提供路由和上下文包装,multipart 全靠你自己解析、校验、存盘。最容易卡住的地方是忘了 ParseMultipartForm,或者把 Express/Multer 的思维直接搬过来。










