探索Gin框架:Golang使用Gin完成文件上传

慈云数据 2024-05-29 技术支持 48 0

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。

前言

在之前的文章中,我们讲解了Gin框架的快速入门使用,今天我们来聊聊如何使用Gin实现文件上传

Go标准库net/http对文件上传已经提供了非常完善的支持,而Gin框架在其基础上进一步封装,因此使用Gin开发文件上传功能时,只需要简单几行代码便可以实现,Gin框架支持单个文件与多个文件同时上传。

目录

编辑

前言

使用原生net/http库实现文件上传

使用Gin实现文件上传

单个文件上传

FormFile()获取文件

SaveUploadedFile()保存到本地 

设置缓冲区大小

限制文件大小

限制文件类型

完整示例

测试文件上传

多个文件上传

MultipartForm()获取多个文件

测试文件上传

总结


使用原生net/http库实现文件上传

我们首先看看实现一个HTTP服务器,提供文件上传功能的简单示例

package main
import (
    "io"
    "io/ioutil"
    "log"
    "net/http"
    "github.com/julienschmidt/httprouter"
)
const (
    MAX_UPLOAD_SIZE = 1024 * 1024 * 20 //最大上传大小,50MB
)
func main() {
    r := RegisterHandlers()
    http.ListenAndServe(":8080", r)  // 开启一个http服务
}
// 定义路由
func RegisterHandlers() *httprouter.Router {
    router := httprouter.New()
    router.POST("/upload", uploadHandler)
    return router
}
// 文件上传接口
func uploadHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
    r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE)
    if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil {
        log.Printf("File is too big")
        return
    }
    file, headers, err := r.FormFile("file")
    if err != nil {
        log.Printf("Error when try to get file: %v", err)
        return
    }
    //获取上传文件的类型
    if headers.Header.Get("Content-Type") != "image/png" {
        log.Printf("只允许上传png图片")
        return
    }
    data, err := ioutil.ReadAll(file)
    if err != nil {
        log.Printf("Read file error: %v", err)
        return
    }
    fn := headers.Filename
    err = ioutil.WriteFile("./video/"+fn, data, 0666)
    if err != nil {
        log.Printf("Write file error: %v", err)
        return
    }
    w.WriteHeader(http.StatusCreated)
    io.WriteString(w, "Uploaded successfully")
}

如上我们通过r.FormFile函数获取上传的文件对象,以及文件的相关信息。然后通过headers.Header.Get函数获取上传文件的类型,判断类型是否符合要求。接着,使用ioutil.ReadAll函数读取文件的内容,并将其存储在data变量中。然后,通过headers.Filename获取上传文件的文件名,并使用ioutil.WriteFile函数将文件内容写入到指定路径下的文件中。

使用Gin实现文件上传

单个文件上传

FormFile()获取文件

单文件上传使用gin.Context的FormFile()方法,该方法的值为POST请求中文件上传字段的名称:

 engine := gin.Default()
 engine.POST("/upload", func(c *gin.Context) {
     file, err := c.FormFile("file")
 })
 engine.Run()

SaveUploadedFile()保存到本地 

调用gin.Context的SaveUploadedFile()方法可以将文件保存到某个目录下:

 dst := "./uploads/" + file.Filename
 c.SaveUploadedFile(file,"./uploadFile")

设置缓冲区大小

Go默认文件上传缓冲区为32M,当有大量文件上传时,服务器内存的压力会很大,因此可以通过MaxMultipartMemory属性来设置缓冲区大小:

 //8M
 engine.MaxMultipartMemory = 8 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon