* binding: add support of multipart multi files (#1878) * update readme: add multipart file binding
This commit is contained in:
		
							
								
								
									
										38
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								README.md
									
									
									
									
									
								
							@ -959,32 +959,36 @@ result:
 | 
			
		||||
### Multipart/Urlencoded binding
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
package main
 | 
			
		||||
type ProfileForm struct {
 | 
			
		||||
	Name   string                `form:"name" binding:"required"`
 | 
			
		||||
	Avatar *multipart.FileHeader `form:"avatar" binding:"required"`
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type LoginForm struct {
 | 
			
		||||
	User     string `form:"user" binding:"required"`
 | 
			
		||||
	Password string `form:"password" binding:"required"`
 | 
			
		||||
	// or for multiple files
 | 
			
		||||
	// Avatars []*multipart.FileHeader `form:"avatar" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	router := gin.Default()
 | 
			
		||||
	router.POST("/login", func(c *gin.Context) {
 | 
			
		||||
	router.POST("/profile", func(c *gin.Context) {
 | 
			
		||||
		// you can bind multipart form with explicit binding declaration:
 | 
			
		||||
		// c.ShouldBindWith(&form, binding.Form)
 | 
			
		||||
		// or you can simply use autobinding with ShouldBind method:
 | 
			
		||||
		var form LoginForm
 | 
			
		||||
		var form ProfileForm
 | 
			
		||||
		// in this case proper binding will be automatically selected
 | 
			
		||||
		if c.ShouldBind(&form) == nil {
 | 
			
		||||
			if form.User == "user" && form.Password == "password" {
 | 
			
		||||
				c.JSON(200, gin.H{"status": "you are logged in"})
 | 
			
		||||
			} else {
 | 
			
		||||
				c.JSON(401, gin.H{"status": "unauthorized"})
 | 
			
		||||
			}
 | 
			
		||||
		if err := c.ShouldBind(&form); err != nil {
 | 
			
		||||
			c.String(http.StatusBadRequest, "bad request")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err := c.SaveUploadedFile(form.Avatar, form.Avatar.Filename)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			c.String(http.StatusInternalServerError, "unknown error")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// db.Save(&form)
 | 
			
		||||
 | 
			
		||||
		c.String(http.StatusOK, "ok")
 | 
			
		||||
	})
 | 
			
		||||
	router.Run(":8080")
 | 
			
		||||
}
 | 
			
		||||
@ -992,7 +996,7 @@ func main() {
 | 
			
		||||
 | 
			
		||||
Test it with:
 | 
			
		||||
```sh
 | 
			
		||||
$ curl -v --form user=user --form password=password http://localhost:8080/login
 | 
			
		||||
$ curl -X POST -v --form name=user --form "avatar=@./avatar.png" http://localhost:8080/profile
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### XML, JSON, YAML and ProtoBuf rendering
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user