Go文件上传需先调用ParseMultipartForm设置内存阈值(如33554432),再用FormFile获取文件流;统一通过r.MultipartForm.File["files"]处理单/多文件;严格校验Size与DetectContentType识别的真实MIME类型;保存时须路径过滤、UUID重命名、权限控制。
在 Go 中实现文件上传,关键是用好 http.Request 的 ParseMultipartForm 和 FormFile 方法,配合合理的校验与存储逻辑。多文件和大小限制不是额外功能,而是解析和校验环节的自然延伸。
Go 默认只将小文件读入内存,大文件会临时写入磁盘。必须显式调用 ParseMultipartForm 并传入最大内存限制(单位字节),否则 FormFile 可能返回空或 panic。
r.MultipartForm 为 nil,FormFile 将无法获取文件r.ParseMultipartForm(0) 会导致全部写入临时磁盘,失去内存控制前端用 ,后端用 r.MultipartForm.File["files"] 获取文件切片,无需区分单/多——它天然返回 []*multipart.FileHeader。
FileHeader 调用 r.FormFile 打开流FileHeader.Size 是文件原始大小(未解压、未编码),可用于前置校验len(fileBytes) 校验大小——大文件不能全读进内存仅检查扩展名极易被绕过。应在读取前用 FileHeader.Size 拦截超限文件,并用 http.DetectContentType 验证真实 MIME 类型。
http.DetectCont
entType,比对白名单(如 image/jpeg, application/pdf)用户提交的 Filename 不可信。必须剥离路径、生成唯一名、限定保存目录,且禁止执行权限。
filepath.Base(header.Filename) 去掉恶意路径(如 ../../../etc/passwd)uuid.New().String() + ext 重命名,避免覆盖和猜解os.MkdirAll(dir, 0755) 创建;写入时用 os.O_CREATE|os.O_WRONLY|os.O_EXCL 防覆盖