Skip to content

Commit

Permalink
update for supporting file binding
Browse files Browse the repository at this point in the history
  • Loading branch information
p581581 committed Mar 1, 2018
1 parent 5d3f30c commit 345232f
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 2 deletions.
2 changes: 2 additions & 0 deletions binding/binding.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ func Default(method, contentType string) Binding {
return ProtoBuf
case MIMEMSGPACK, MIMEMSGPACK2:
return MsgPack
case MIMEMultipartPOSTForm:
return FormMultipart
default: //case MIMEPOSTForm, MIMEMultipartPOSTForm:
return Form
}
Expand Down
4 changes: 2 additions & 2 deletions binding/binding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ func TestBindingDefault(t *testing.T) {
assert.Equal(t, Default("POST", MIMEPOSTForm), Form)
assert.Equal(t, Default("PUT", MIMEPOSTForm), Form)

assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), FormMultipart)
assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), FormMultipart)

assert.Equal(t, Default("POST", MIMEPROTOBUF), ProtoBuf)
assert.Equal(t, Default("PUT", MIMEPROTOBUF), ProtoBuf)
Expand Down
5 changes: 5 additions & 0 deletions binding/form.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,10 @@ func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error {
if err := mapForm(obj, req.MultipartForm.Value); err != nil {
return err
}

if err := mapFiles(obj, req); err != nil {
return err
}

return validate(obj)
}
36 changes: 36 additions & 0 deletions binding/form_mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,47 @@ package binding

import (
"errors"
"fmt"
"io/ioutil"
"net/http"
"reflect"
"strconv"
"time"
)

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) != "[]uint8" {
continue
}

inputFieldName := typeField.Tag.Get("form")
if inputFieldName == "" {
inputFieldName = typeField.Name
}

file, _, err := req.FormFile(inputFieldName)
if err != nil {
return err
}

data, err := ioutil.ReadAll(file)
if err != nil {
return err
}

structField.SetBytes(data)

}
return nil
}

func mapForm(ptr interface{}, form map[string][]string) error {
typ := reflect.TypeOf(ptr).Elem()
val := reflect.ValueOf(ptr).Elem()
Expand Down

0 comments on commit 345232f

Please sign in to comment.