活動話題:#yyds干貨盤點#

目錄

??前言??

??正文??

??結尾??

前言

利用 Gin 框架,我們可以非常簡單的實現上傳服務接口的開發,今天我們就來看看 Gin 在這方面都支持哪些能力,能夠為我們減少多少任務量。

正文

當設計開發一個存儲服務的時候,首先就要想到如何實現上傳存儲功能,Gin 框架能夠非常簡單的支持單文件上傳和多文件同時上傳,接下來通過實例分別介紹這兩方面的內容。

單文件上傳

首先,我們來看 Gin 框架如何實現單文件上傳,一般上傳文件格式會被定義成 multipart forms 類型,并且保存在 file 字段中。在服務器端處理上傳數據時,可以通過 FormFile() 方法來解析 file 參數。具體編碼請看下面的代碼實例:

package main 

import "github.com/gin-gonic/gin"

func main() {
router := gin.Default()
// 為 multipart forms 類型設置一個較低的內存緩存 (默認是 32 MiB)
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// 單文件
file, _ := c.FormFile("file")
log.Println(file.Filename)

// 保存上傳文件到目標目錄
dst := "/Users/lz/go/src/bag/bin/test/dst/dst.jpg"
c.SaveUploadedFile(file, dst)

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


當我們在服務端使用 FormFile() 方法解析 file 字段時,返回的 file 對象是一個 multipart.FileHeader 指針類型,其中包含了源文件數據的地址,然后使用 SaveUploadedFile() 方法保存 file 對象,參數 dst 是目標文件地址。

代碼非常簡單,接下來讓我測試一下服務是否好用,我們 curl 工具模擬上傳行為,具體命令如下:

 curl -X POST http://localhost:8080/upload /
-F "file=@/Users/lz/go/src/bag/bin/test/src/cover.jpg" /
-H "Content-Type: multipart/form-data"


結果:在目標目錄中找到了上傳的 cover.jpg 文件,如下圖所示:

#yyds干貨盤點#

多文件上傳

Gin 框架不僅可以非常簡單的支持單文件上傳,還可以支持多文件同時上傳,上傳文件格式也會被定義成 multipart forms 類型,并且保存在 ??upload[]?? 字段中。在服務器端處理上傳數據時,可以通過 File() 方法來解析 ??upload[]?? 參數。具體編碼請看下面的代碼實例:

func main() {
router := gin.Default()
// 限定 multipart forms 內容占用大小
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// 多個 form 類型文件
form, _ := c.MultipartForm()
files := form.File["upload[]"]

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

// 保存到指定文件
dst := "/Users/lz/go/src/bag/bin/test/dst/" + file.Filename
c.SaveUploadedFile(file, dst)
}
c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
})
router.Run(":8080")
}


原理上類似,只是在服務器端對同時上傳到多個文件分別進行了保存而已。

下面讓我們同時上傳兩個文件測試一下服務是否好用,具體命令如下:

curl -X POST http://localhost:8080/upload /
-F "upload[]=@/Users/lz/go/src/bag/bin/test/src/cover.jpg" /
-F "upload[]=@/Users/lz/go/src/bag/bin/test/src/cover2.jpg" /
-H "Content-Type: multipart/form-data"


結果也是正確的。

結尾

通過文本的介紹,我們可以了解到 Gin 框架能夠非常簡單的支持單文件上傳和多文件同時上傳。




作者簡介:大家好,我是 liuzhen007,是一位音視頻技術愛好者,同時也是CSDN博客專家、華為云社區云享專家、簽約作者,歡迎關注我分享更多音視頻相關內容!