update for supporting file binding (#1264)

update for supporting multipart form and file binding 

example:
```
type PhoptUploadForm struct {
	imgData    *multipart.FileHeader `form:"img_data" binding:"required"`
	ProjectID   string `form:"project_id" binding:"required"`
	Description string `form:"description binding:"required"`
}
```


ref: https://github.com/gin-gonic/gin/issues/1263
This commit is contained in:
Boyi Wu
2019-03-18 10:16:34 +08:00
committed by Bo-Yi Wu
parent bcf36ade9f
commit c16bfa7949
4 changed files with 129 additions and 3 deletions

View File

@ -7,6 +7,7 @@ package binding
import (
"errors"
"fmt"
"net/http"
"reflect"
"strconv"
"strings"
@ -15,6 +16,34 @@ import (
"github.com/gin-gonic/gin/internal/json"
)
func mapFiles(ptr interface{}, req *http.Request) error {
typ := reflect.TypeOf(ptr).Elem()
val := reflect.ValueOf(ptr).Elem()
for i := 0; i < typ.NumField(); i++ {
typeField := typ.Field(i)
structField := val.Field(i)
t := fmt.Sprintf("%s", typeField.Type)
if string(t) != "*multipart.FileHeader" {
continue
}
inputFieldName := typeField.Tag.Get("form")
if inputFieldName == "" {
inputFieldName = typeField.Name
}
_, fileHeader, err := req.FormFile(inputFieldName)
if err != nil {
return err
}
structField.Set(reflect.ValueOf(fileHeader))
}
return nil
}
var errUnknownType = errors.New("Unknown type")
func mapUri(ptr interface{}, m map[string][]string) error {