go 标准库 http 包原生支持文件上传下载;需先调用 req.parsemultipartform(32
Go 标准库的 http 包完全支持文件上传与下载,无需第三方依赖;关键在于正确处理 multipart/form-data 请求体和设置响应头。
用 req.ParseMultipartForm 解析上传文件
浏览器表单提交文件时,Content-Type 是 multipart/form-data,必须先调用 ParseMultipartForm 才能访问 req.MultipartForm。否则 req.FormFile 会返回 http.ErrNotMultipart。
常见错误是忽略参数:该方法第一个参数是最大内存缓存字节数(如 32 表示 32MB),超过部分会写入临时磁盘文件。设为 0 会导致解析失败。
- 推荐设为合理上限,例如
req.ParseMultipartForm(32 - 调用后通过
req.FormFile("file")获取*multipart.FileHeader -
header.Filename是客户端原始文件名,不可直接拼路径,需校验或重命名 - 用
file, err := header.Open()得到可读流,再用io.Copy写入本地文件
用 http.ServeFile 或手动 io.Copy 实现安全下载
http.ServeFile 简单但危险:它会自动解析 URL 路径,若用户传 ../../etc/passwd 可能触发目录穿越。生产环境应避免直接使用。