1eae2f99e0c90164b55e50494c195d3f
Go 文件上传

一、前言

上一篇 我们使用 gin 讲解了 web 编程基础的 GET 和 POST 请求。本篇主要介绍下 web 编程中的文件上传部分。

二、单文件上传

  1. 新建项目,并添加 main.go

    // main.go
    package main
    
    import (
    "fmt"
    "net/http"
    "path/filepath"
    
    "github.com/gin-gonic/gin"
    )
    
    func main() {
    router := gin.Default()
    // 设置上传限制 (默认是 32 MiB)
    router.MaxMultipartMemory = 8 << 20 // 8 MiB
    router.Static("/", "./public")
    
    router.POST("/upload", func(c *gin.Context) {
        name := c.PostForm("name")
        email := c.PostForm("email")
    file, err := c.FormFile("file")
    if err != nil {
        c.String(http.StatusBadRequest, fmt.Sprintf("上传失败: %s", err.Error()))
        return
    }
    
    filename := filepath.Base(file.Filename)
    if err := c.SaveUploadedFile(file, filename); err != nil {
        c.String(http.StatusBadRequest, fmt.Sprintf("上传错误: %s", err.Error()))
        return
    }
    
    c.String(http.StatusOK, fmt.Sprintf("文件 %s 上传成功。参数 name=%s,email=%s.", file.Filename, name, email))
    }) router.Run(":8080") }
  2. 新建 public 文件夹,并添加 index.html 文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="utf-8" />
     <title>单文件上传</title>
    </head>
    <body>
     <h1>上传单文件并且带参数</h1>
    
     <form action="/upload" method="post" enctype="multipart/form-data">
       Name: <input type="text" name="name" /><br />
       Email: <input type="email" name="email" /><br />
       Files: <input type="file" name="file" /><br /><br />
       <input type="submit" value="Submit" />
     </form>
    </body>
    </html>
  3. 运行
    go run main.go

三、多文件上传

  1. 添加多文件上传路由

    router.POST("/multipleUpload", func(c *gin.Context) {
        name := c.PostForm("name")
        email := c.PostForm("email")
    form, err := c.MultipartForm()
    if err != nil {
        c.String(http.StatusBadRequest, fmt.Sprintf("上传失败: %s", err.Error()))
        return
    }
    files := form.File["files"]
    
    for _, file := range files {
        filename := filepath.Base(file.Filename)
        if err := c.SaveUploadedFile(file, filename); err != nil {
            c.String(http.StatusBadRequest, fmt.Sprintf("上传错误: %s", err.Error()))
            return
        }
    }
    
    c.String(http.StatusOK, fmt.Sprintf("上传成功 %d 文件。 参数 name=%s,email=%s.", len(files), name, email))
    })
  2. 在 public 文件夹中添加多文件上传界面 upload.html

    ```


    多文件上传

    多文件上传并且带参数

top Created with Sketch.