revel 默认不校验上传文件大小,需手动调用 c.request.parsemultipartform(32

Revel 中默认不校验上传文件大小
Revel 框架本身对 multipart/form-data 请求不做任何文件大小限制,c.Request.ParseMultipartForm() 会尝试将整个请求体读入内存或临时磁盘,若未显式设置阈值,可能触发 OOM 或长时间阻塞。你看到的“上传卡住”“500 错误无日志”“服务假死”,大概率是这个原因。
必须在 ParseMultipartForm 时传入 maxMemory 参数
Go 标准库 http.Request.ParseMultipartForm() 要求你明确指定内存缓冲上限(单位字节),超过部分自动落盘;Revel 不封装这层逻辑,所以必须手动调用并传参。漏掉这一步,等于把上传控制权完全交给底层 HTTP Server。
c.Request.ParseMultipartForm(32 表示最多 32MB 用内存缓存,超出部分写入临时文件- 若设为
0,所有数据都写磁盘,但依然不限总大小——仍需后续校验 - 必须在首次访问
c.Request.MultipartForm或c.Request.FormFile前调用,否则 panic
结合中间件做前置校验更安全
仅靠 ParseMultipartForm 的内存阈值不够:攻击者可构造超大文件让磁盘填满,或绕过表单直接发 raw multipart 请求。推荐在拦截器中检查 Content-Length 头(前提是客户端发送了该头):
- 在
app/interceptors.go的BEFORE拦截器中加判断:if c.Request.ContentLength > 50 - 注意:
Content-Length可被伪造,不能替代后端解析校验,但能快速拒绝明显超限请求 - 对真正关键的上传接口(如用户头像、附件),建议额外用
c.Request.MultipartForm.File遍历每个*multipart.FileHeader,检查Size字段是否超标
nginx 层也要同步限制(生产环境必做)
Revel 运行在 nginx 后面时,nginx 默认只允许 1MB 文件上传,若 Revel 设置了 50MB 限制而 nginx 没调,请求根本到不了 Go 层——你会收到 nginx 的 413 错误,且日志里看不到 Revel 记录。
- 在 nginx 配置的
server或location块中加:client_max_body_size 50M; - 确保该值 ≥ Revel 后端允许的最大值,否则前端永远收不到“文件太大”的业务提示
- 如果用了
proxy_buffering on,还需检查proxy_buffer_size和proxy_buffers是否足够承载大请求头
client_max_body_size、Revel 中 ParseMultipartForm 的参数、以及业务代码里对单个文件 FileHeader.Size 的检查。只要有一处宽松,就可能被利用。











