Go语言通过ParseMultipartForm解析表单并设内存上限,再用FormFile按name获取文件,配合os.Create保存,需注意文件校验、路径安全与大文件处理。
Go语言处理Web表单文件上传非常直接,核心是用http.Request的ParseMultipartForm和FormFile方法,配合os.Create保存文件。关键点在于正确解析 multipart 数据、校验文件、避免内存溢出,并注意路径安全。
HTML 表单需设置 enctype="multipart/form-data",后端用 r.ParseMultipartForm 初始化解析(推荐设上限防止大文件占满内存),再用 r.FormFile 按 name 属性取文件:
r.ParseMultipartForm(32 表示最多读取 32MB 到内存(超出部分写入临时磁盘)file, header, err := r.FormFile("myfile") 中 "myfile" 要与 HTML 的 一致header.Filename 是客户端传来的原始文件名,不可直接拼接路径不能直接使用 header.Filename 构造本地路径,否则可能被构造为 ../../etc/passwd 等恶意路径。建议做法:
path.Base(header.Filename) 提取纯文件名(去掉路径部分)uuid.New().String() + 原扩展名),避免重名和覆盖"./uploads/"),用 filepath.Join(uploadDir, safeName) 拼接[".jpg", ".png", ".pdf"])一个简洁可靠的上传处理函数大致如下:
r.ParseMultipartForm,失败则返回 400r.FormFile 获取文件句柄;若无文件或字段名错,返回 400
安全性)os.Create),用 io.Copy 流式写入,避免全加载进内存确保 HTML 表单结构正确:
(加 multiple 可多文件),服务端通过 r.FormValue("title") 获取基本上就这些。Golang 的文件上传不复杂但容易忽略校验和路径安全,把解析、命名、保存三步拆清楚,再加一点防御性处理,就能稳定可用。