前言
在上一篇文章go实现文件上传/下载服务中讲到了自己实现一个文件上传服务,然而我发现gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang).也默认提供了文件上传服务。
本文就来看看 Gin
中的文件上传服务。
创建项目
1
2
3
4
|
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
用于写代码。
单文件
1
2
3
4
5
6
7
8
9
10
11
12
|
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
来测试一下
1
2
3
|
curl -X POST http://localhost:8080/upload \
-F "file=@/tmp/upload.go" \
-H "Content-Type: multipart/form-data"
|
执行完之后在当前目录下就可以看到 upload.go
这个文件了。
多文件
Gin
除了提供单文件的上传,还提供了多文件的上传,对于有多文件的需求就十分的方便了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
来测试文件上传的功能
1
2
3
4
|
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
除了提供上面的文件上传功能,还有提供限制文件上传大小的功能,这个在实际项目中会有较大的用途。
1
2
|
router := gin.Default()
router.MaxMultipartMemory = 8 << 20
|
使用 MaxMultipartMemory
来配置文件上传的大小限制,默认是32M。
文件下载服务
虽然 go
默认提供了文件服务,但是默认的文件服务会把整个文件夹下所有的文件都暴露,如果我们想做更多的控制就不太方便了,而 Gin
提供了文件下载的服务
1
2
3
4
5
6
7
|
func main() {
router := gin.Default()
router.GET("/local/file", func(c *gin.Context) {
c.File("local/file.go")
})
}
|
Gin
提供的文件服务,可以让我们非常方便的进行控制,甚至是动态文件,比默认的有更多的定制化玩法。
总结
Gin
提供的文件上传和下载服务非常方便,弥补了默认的文件服务在一些场景下的不足,如果默认的不能满足你,可以试试 Gin
。
参考