在基于gin的golang web開發:路由中我們介紹了Gin的路由和一些擷取連結中參數的方法,本文繼續介紹其他擷取參數的方法。
在基于gin的golang web開發:路由中我們介紹了Gin的路由和一些擷取連結中參數的方法,本文繼續介紹其他擷取參數的方法。
檔案上傳
在web開發中檔案上傳是一個很常見的需求,下面我們來看一下基于Gin的檔案上傳。
func main() {
router := gin.Default()
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
file, _ := c.FormFile("file")
log.Println(file.Filename)
c.SaveUploadedFile(file, dst)
c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
})
router.POST("/multiple_upload", func(c *gin.Context) {
form, _ := c.MultipartForm()
files := form.File["upload[]"]
for _, file := range files {
log.Println(file.Filename)
c.SaveUploadedFile(file, dst)
}
c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
})
router.Run(":8080")
}
router.MaxMultipartMemory用于限制上傳檔案的大小,預設大小為32MiB。這個值可以根據你的業務設定具體的值,盡量不要設定的太大。
在本例中可以看到單檔案上傳和多檔案上傳的處理方式是不一樣的。
單檔案上傳時使用file, _ := c.FormFile("file")擷取用戶端傳過來的檔案。這裡使用 _ 忽略了錯誤,在生産環境你可能需要處理一下錯誤。file.Filename可以擷取到檔案名。注意:file.Filename是一個可選的參數,不要使用這個參數儲存檔案,儲存檔案時最好自己生成一個新的檔案名。
c.SaveUploadedFile儲存檔案到檔案系統,第一個參數傳入擷取到的檔案,第二個參數輸入檔案路徑。由于Go語言跨平台的特性,在傳入檔案路徑參數的時候你可能要考慮到生産環境伺服器的作業系統。例如windows作業系統的檔案路徑可能是"c:\uploadfiles\1.png",linux作業系統的檔案路徑可能是"/var/uploadfiles/1.png"。
多檔案上傳時先擷取到表單form, _ := c.MultipartForm(),然後擷取到檔案數組files := form.File["upload[]"],最後循環操作檔案數組中的每個檔案。
在本例中直接儲存檔案到檔案系統了,業務系統中可能會把上傳的檔案儲存到阿裡雲的OSS或者七牛雲等檔案系統,替換c.SaveUploadedFile為不同檔案系統儲存檔案的方法就可以了。
映射參數為Map
檔案參數是數組的時候,Gin可以把參數映射為Map類型。
func main() {
router := gin.Default()
router.POST("/post", func(c *gin.Context) {
ids := c.QueryMap("ids")
names := c.PostFormMap("names")
fmt.Printf("ids: %v; names: %v", ids, names)
})
router.Run(":8080")
}
c.QueryMap可以擷取到查詢字元串中的數組,c.PostFormMap可以擷取到表單參數中的數組。向/post?ids[a]=1234&ids[b]=hello post送出資料 names[first]=thinkerou&names[second]=tianou,會看到輸出ids: map[b:hello a:1234]; names: map[second:tianou first:thinkerou]。
還有另外一種處理數組參數的方法。路徑是這樣的/post?ids=1234,hello,這種情況可以用基于gin的golang web開發:路由中提到的擷取查詢字元串的方法:DefaultQuery或者Query,然後分割字元串。
文章出處:基于gin的golang web開發:路由二