基於gin的golang web開發:路由二

基於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開發:路由二

Tags: