活動(dòng)話題:#yyds干貨盤點(diǎn)#
目錄
??前言??
??正文??
前言
利用 Gin 框架,我們可以非常簡單的實(shí)現(xiàn)上傳服務(wù)接口的開發(fā),今天我們就來看看 Gin 在這方面都支持哪些能力,能夠?yàn)槲覀儨p少多少任務(wù)量。
正文
當(dāng)設(shè)計(jì)開發(fā)一個(gè)存儲(chǔ)服務(wù)的時(shí)候,首先就要想到如何實(shí)現(xiàn)上傳存儲(chǔ)功能,Gin 框架能夠非常簡單的支持單文件上傳和多文件同時(shí)上傳,接下來通過實(shí)例分別介紹這兩方面的內(nèi)容。
單文件上傳
首先,我們來看 Gin 框架如何實(shí)現(xiàn)單文件上傳,一般上傳文件格式會(huì)被定義成 multipart forms 類型,并且保存在 file 字段中。在服務(wù)器端處理上傳數(shù)據(jù)時(shí),可以通過 FormFile() 方法來解析 file 參數(shù)。具體編碼請(qǐng)看下面的代碼實(shí)例:
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
// 為 multipart forms 類型設(shè)置一個(gè)較低的內(nèi)存緩存 (默認(rèn)是 32 MiB)
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// 單文件
file, _ := c.FormFile("file")
log.Println(file.Filename)
// 保存上傳文件到目標(biāo)目錄
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")
}
當(dāng)我們?cè)诜?wù)端使用 FormFile() 方法解析 file 字段時(shí),返回的 file 對(duì)象是一個(gè) multipart.FileHeader 指針類型,其中包含了源文件數(shù)據(jù)的地址,然后使用 SaveUploadedFile() 方法保存 file 對(duì)象,參數(shù) dst 是目標(biāo)文件地址。
代碼非常簡單,接下來讓我測(cè)試一下服務(wù)是否好用,我們 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"
結(jié)果:在目標(biāo)目錄中找到了上傳的 cover.jpg 文件,如下圖所示:
多文件上傳
Gin 框架不僅可以非常簡單的支持單文件上傳,還可以支持多文件同時(shí)上傳,上傳文件格式也會(huì)被定義成 multipart forms 類型,并且保存在 ??upload[]?
? 字段中。在服務(wù)器端處理上傳數(shù)據(jù)時(shí),可以通過 File() 方法來解析 ??upload[]?
? 參數(shù)。具體編碼請(qǐng)看下面的代碼實(shí)例:
func main() {
router := gin.Default()
// 限定 multipart forms 內(nèi)容占用大小
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// 多個(gè) 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")
}
原理上類似,只是在服務(wù)器端對(duì)同時(shí)上傳到多個(gè)文件分別進(jìn)行了保存而已。
下面讓我們同時(shí)上傳兩個(gè)文件測(cè)試一下服務(wù)是否好用,具體命令如下:
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"
結(jié)果也是正確的。
結(jié)尾
通過文本的介紹,我們可以了解到 Gin 框架能夠非常簡單的支持單文件上傳和多文件同時(shí)上傳。
作者簡介:大家好,我是 liuzhen007,是一位音視頻技術(shù)愛好者,同時(shí)也是CSDN博客專家、華為云社區(qū)云享專家、簽約作者,歡迎關(guān)注我分享更多音視頻相關(guān)內(nèi)容!