Gin框架 :文件上传

上传单个文件:

上传文件用POST方法,之前提到过的multipart/form-data编码格式,就是用于上传文件的,gin把go原生的request封装到了c.Request中

package main

import (
    "github.com/gin-gonic/gin"
    "fmt"
    "net/http"
    "os"
    "log"
    "io"
)

func uploadFile(c *gin.Context) {
// FormFile方法会读取参数“upload”后面的文件名,返回值是一个File指针,和一个FileHeader指针,和一个err错误。
    file, header, err := c.Request.FormFile("upload")
    if err != nil {
        c.String(http.StatusBadRequest, "Bad request")
        return
    }
    // header调用Filename方法,就可以得到文件名
    filename := header.Filename
    fmt.Println(file, err, filename)

// 创建一个文件,文件名为filename,这里的返回值out也是一个File指针
    out, err := os.Create(filename)
    if err != nil {
        log.Fatal(err)
    }

    defer out.Close()

// 将file的内容拷贝到out
    _, err = io.Copy(out, file)
    if err != nil {
        log.Fatal(err)
    }

    c.String(http.StatusCreated, "upload successful \n")
}

func main() {
    router := gin.Default()

// 调用POST方法,传入路由参数和路由函数
    router.POST("/upload", uploadFile)

// 监听端口8000,注意冒号。
    router.Run(":8000")
}

在终端输入

curl -X POST http://127.0.0.1:8000/upload -F "upload=@/Users/Peter/Pictures/avatar.jpg" -H "Content-Type: multipart/form-data"

上传多个文件:

模拟上传多个文件,与上传单个文件区别不大,只是用MultipartForm方法替代了FormFile方法,而MultipartForm方法的返回值是一个数组,数组元素为file,所以只需要遍历一下这个数组,并取出文件名,再进行拷贝即可。

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "os"
    "io"
    "net/http"
    "fmt"
)

func upldFiles(c *gin.Context) {
    err := c.Request.ParseMultipartForm(200000)
    if err != nil {
        log.Fatal(err)
    }
// 获取表单
    form := c.Request.MultipartForm
// 获取参数upload后面的多个文件名,存放到数组files里面,
    files := form.File["upload"]
// 遍历数组,每取出一个file就拷贝一次
    for i, _ := range files {
        file, err := files[i].Open()
        defer file.Close()
        if err != nil {
            log.Fatal(err)
        }

        fileName := files[i].Filename
        fmt.Println(fileName)

        out, err := os.Create(fileName)
        defer out.Close()
        if err != nil {
            log.Fatal(err)
        }

        _, err = io.Copy(out, file)
        if err != nil {
            log.Fatal(err)
        }

        c.String(http.StatusCreated, "uploadFiles success! \n")
    }
}

func main() {
    router := gin.Default()

    router.POST("/upload", upldFiles)

    router.Run(":8088")
}

在终端输入:

curl -X POST http://127.0.0.1:8088/upload -F "upload=@/Users/Peter/Pictures/avatar.jpg" -F "upload=@/Users/Peter/Pictures/爬虫.jpg" -H "Content-Type: multipart/form-data"

 

posted @ 2022-05-23 15:23  Mr.peter  阅读(815)  评论(0编辑  收藏  举报