boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

怎样用Golang实现文件上传 解析multipart/form-data请求


avatar
作者 2025年8月24日 40

前端通过enctype="multipart/form-data"表单上传文件;2. Go服务端用net/http和mime/multipart解析,调用ParseMultipartForm限制大小并获取文件。

怎样用Golang实现文件上传 解析multipart/form-data请求

处理

multipart/form-data

请求实现文件上传在 golang 中非常常见,尤其是在构建 Web 服务时。Go 的标准库已经提供了完整支持,我们可以通过

net/http

mime/multipart

包轻松实现。

1. 基本的文件上传 html 表单

前端需要一个表单,设置

enctype="multipart/form-data"

<form action=”/upload” method=”post” enctype="multipart/form-data">
  <input type=”text” name=”title” placeholder=”标题”>
  <input type=”file” name=”file” >
  <button type=”submit”>上传</button>
</form>

2. 服务端解析 multipart 请求

使用

http.Request.ParseMultipartForm()

解析请求体,然后通过

FormFile

MultipartForm

获取文件和字段。

示例代码:

立即学习go语言免费学习笔记(深入)”;

main.go

 package main  import (     "fmt"     "io"     "net/http"     "os" )  func uploadHandler(w http.ResponseWriter, r *http.Request) {     // 限制上传大小,例如 10MB     r.ParseMultipartForm(10 << 20)      // 获取表单中的文件(input name="file")     file, handler, err := r.FormFile("file")     if err != nil {         http.Error(w, "无法获取文件", http.StatusBadRequest)         return     }     defer file.Close()      // 可选:打印文件信息     fmt.Printf("上传文件名: %s, 大小: %dn", handler.Filename, handler.Size)      // 创建本地文件用于保存     dst, err := os.Create("./uploads/" + handler.Filename)     if err != nil {         http.Error(w, "无法创建文件", http.StatusInternalServerError)         return     }     defer dst.Close()      // 将上传的文件内容拷贝到本地文件     _, err = io.Copy(dst, file)     if err != nil {         http.Error(w, "保存文件失败", http.StatusInternalServerError)         return     }      // 获取其他文本字段(如 title)     title := r.FormValue("title")     fmt.Printf("标题: %sn", title)      fmt.Fprintf(w, "文件 %s 上传成功,标题为: %s", handler.Filename, title) }  func main() {     // 确保上传目录存在     os.MkdirAll("./uploads", os.ModePerm)      http.HandleFunc("/upload", uploadHandler)     http.Handle("/", http.FileServer(http.Dir("."))) // 提供静态页面      fmt.Println("服务器启动在 :8080")     http.ListenAndServe(":8080", nil) } 

3. 处理多个文件或字段

如果表单中有多个文件或字段,可以使用

r.MultipartForm

直接访问所有内容。

修改上面的 handler 部分:

 // 解析 multipart 表单 err := r.ParseMultipartForm(10 << 20) if err != nil {     http.Error(w, "解析表单失败", http.StatusBadRequest)     return }  form := r.MultipartForm  // 获取所有文件 files := form.File["file"] // 支持多个文件,input 使用 name="file"  for _, f := range files {     src, err := f.Open()     if err != nil {         continue     }     defer src.Close()      dst, err := os.Create("./uploads/" + f.Filename)     if err != nil {         continue     }     defer dst.Close()      io.Copy(dst, src) }  // 获取所有文本字段 title := form.Value["title"][0] 

4. 安全与优化建议

  • 限制文件大小:在
    ParseMultipartForm

    中设置合理内存上限,防止内存溢出。

  • 验证文件类型:不要只依赖扩展名,可读取前几个字节判断 MIME 类型。
  • 重命名文件:避免恶意文件名,使用 UUID 或时间戳命名。
  • 检查目录遍历:确保文件名不包含
    ../

    等路径穿越字符。

基本上就这些。Golang 标准库对 multipart 处理很完善,只要注意边界和安全,就能稳定实现文件上传功能。



评论(已关闭)

评论已关闭