Gin 实现上传/下载服务

本文就来看看 Gin 中的文件上传服务。

创建项目

mkdir ginupload && cd ginupload
go mod init ginupload
go get -u github.com/gin-gonic/gin
touch main.go

我们创建一个 ginupload 的目录用来存放代码,并且使用 go mod 来管理依赖。

接着通过 go get 把 gin 作为第三方依赖加入到项目中,然后创建了 main.go 用于写代码。

单文件上传

func main() {
    router := gin.Default()
    router.POST("/upload", func(c *gin.Context) {
        file, _ := c.FormFile("file")
        log.Println(file.Filename)

        c.SaveUploadedFile(file, "./" + file.Filename)

        c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
    })
    router.Run(":8080")
}

可以看到用 Gin 来实现文件上传服务的代码非常简单。我们使用 curl 来测试一下

curl -X POST http://localhost:8080/upload \
  -F "file=@/tmp/upload.go" \
  -H "Content-Type: multipart/form-data"

执行完之后在当前目录下就可以看到 upload.go 这个文件了。

多文件上传

Gin 除了提供单文件的上传,还提供了多文件的上传,对于有多文件的需求就十分的方便了。

func main() {
    router := gin.Default()
    router.POST("/upload", func(c *gin.Context) {
        form, _ := c.MultipartForm()
        files := form.File["files"]

        for _, file := range files {
            log.Println(file.Filename)

            c.SaveUploadedFile(file, "./" + file.Filename)
        }
        c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
    })
    router.Run(":8080")
}

多文件的上传和单文件的区别不大,简单的几行代码就实现了文件上传的功能。

同样使用 curl 来测试文件上传的功能

curl -X POST http://localhost:8080/upload \
  -F "files=@/tmp/test1.zip" \
  -F "files=@/tmp/test2.zip" \
  -H "Content-Type: multipart/form-data"

不出问题在当前目录中就会多出 test1.zip 和 test2.zip 这两个文件。

限制文件大小

Gin 除了提供上面的文件上传功能,还有提供限制文件上传大小的功能,这个在实际项目中会有较大的用途。

router := gin.Default()
router.MaxMultipartMemory = 8 << 20

使用 MaxMultipartMemory 来配置文件上传的大小限制,默认是32M。

文件下载服务

虽然 go 默认提供了文件服务,但是默认的文件服务会把整个文件夹下所有的文件都暴露,如果我们想做更多的控制就不太方便了,而 Gin 提供了文件下载的服务

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

    router.GET("/local/file", func(c *gin.Context) {
        c.File("local/file.go")
    })
}

Gin 提供的文件服务,可以让我们非常方便的进行控制,甚至是动态文件,比默认的有更多的定制化玩法。

总结

Gin 提供的文件上传和下载服务非常方便,弥补了默认的文件服务在一些场景下的不足,如果默认的不能满足你,可以试试 Gin 。

参考

  • gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance – up to 40 times faster. If you need smashing performance, get yourself some Gin.[3]

参考资料

[1]

gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang).: https://github.com/gin-gonic/gin

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夕Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值