Skip to content

Commit db0fbd4

Browse files
committed
update for supporting file binding
1 parent 5d3f30c commit db0fbd4

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

binding/binding.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func Default(method, contentType string) Binding {
6969
return ProtoBuf
7070
case MIMEMSGPACK, MIMEMSGPACK2:
7171
return MsgPack
72+
case MIMEMultipartPOSTForm:
73+
return FormMultipart
7274
default: //case MIMEPOSTForm, MIMEMultipartPOSTForm:
7375
return Form
7476
}

binding/form.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,10 @@ func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error {
5252
if err := mapForm(obj, req.MultipartForm.Value); err != nil {
5353
return err
5454
}
55+
56+
if err := mapFiles(obj, req); err != nil {
57+
return err
58+
}
59+
5560
return validate(obj)
5661
}

binding/form_mapping.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,47 @@ package binding
66

77
import (
88
"errors"
9+
"fmt"
10+
"io/ioutil"
11+
"net/http"
912
"reflect"
1013
"strconv"
1114
"time"
1215
)
1316

17+
func mapFiles(ptr interface{}, req *http.Request) error {
18+
typ := reflect.TypeOf(ptr).Elem()
19+
val := reflect.ValueOf(ptr).Elem()
20+
for i := 0; i < typ.NumField(); i++ {
21+
typeField := typ.Field(i)
22+
structField := val.Field(i)
23+
24+
t := fmt.Sprintf("%s", typeField.Type)
25+
if string(t) != "[]uint8" {
26+
continue
27+
}
28+
29+
inputFieldName := typeField.Tag.Get("form")
30+
if inputFieldName == "" {
31+
inputFieldName = typeField.Name
32+
}
33+
34+
file, _, err := req.FormFile(inputFieldName)
35+
if err != nil {
36+
return err
37+
}
38+
39+
data, err := ioutil.ReadAll(file)
40+
if err != nil {
41+
return err
42+
}
43+
44+
structField.SetBytes(data)
45+
46+
}
47+
return nil
48+
}
49+
1450
func mapForm(ptr interface{}, form map[string][]string) error {
1551
typ := reflect.TypeOf(ptr).Elem()
1652
val := reflect.ValueOf(ptr).Elem()

0 commit comments

Comments
 (0)