Skip to content

Commit fb769d7

Browse files
martinyonatannaldas
authored andcommitted
🎨 : add some test case for multipart file
1 parent d1ab8e8 commit fb769d7

File tree

2 files changed

+59
-16
lines changed

2 files changed

+59
-16
lines changed

‎bind.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -219,30 +219,26 @@ func (b *DefaultBinder) bindData(destination interface{}, data map[string][]stri
219219
}
220220

221221
// Handle multiple file uploads ([]*multipart.FileHeader, *multipart.FileHeader, []multipart.FileHeader)
222-
if len(files) > 0 {
222+
if len(files) > 0 && isMultipartFile(structField.Type()) {
223223
for _, fileMap := range files {
224224
fileHeaders, exists := fileMap[inputFieldName]
225-
if exists {
226-
if structField.Type() == reflect.TypeOf([]*multipart.FileHeader(nil)) {
225+
if exists && len(fileHeaders) > 0 {
226+
switch structField.Type() {
227+
case reflect.TypeOf([]*multipart.FileHeader(nil)):
227228
structField.Set(reflect.ValueOf(fileHeaders))
228229
continue
229-
} else if structField.Type() == reflect.TypeOf([]multipart.FileHeader(nil)) {
230-
var headers []multipart.FileHeader
231-
for _, fileHeader := range fileHeaders {
232-
headers = append(headers, *fileHeader)
230+
case reflect.TypeOf([]multipart.FileHeader(nil)):
231+
headers := make([]multipart.FileHeader, len(fileHeaders))
232+
for i, fileHeader := range fileHeaders {
233+
headers[i] = *fileHeader
233234
}
234235
structField.Set(reflect.ValueOf(headers))
235236
continue
236-
} else if structField.Type() == reflect.TypeOf(&multipart.FileHeader{}) {
237-
238-
if len(fileHeaders) > 0 {
239-
structField.Set(reflect.ValueOf(fileHeaders[0]))
240-
}
237+
case reflect.TypeOf(&multipart.FileHeader{}):
238+
structField.Set(reflect.ValueOf(fileHeaders[0]))
241239
continue
242-
} else if structField.Type() == reflect.TypeOf(multipart.FileHeader{}) {
243-
if len(fileHeaders) > 0 {
244-
structField.Set(reflect.ValueOf(*fileHeaders[0]))
245-
}
240+
case reflect.TypeOf(multipart.FileHeader{}):
241+
structField.Set(reflect.ValueOf(*fileHeaders[0]))
246242
continue
247243
}
248244
}
@@ -434,3 +430,10 @@ func setFloatField(value string, bitSize int, field reflect.Value) error {
434430
}
435431
return err
436432
}
433+
434+
func isMultipartFile(field reflect.Type) bool {
435+
return reflect.TypeOf(&multipart.FileHeader{}) == field ||
436+
reflect.TypeOf(multipart.FileHeader{}) == field ||
437+
reflect.TypeOf([]*multipart.FileHeader(nil)) == field ||
438+
reflect.TypeOf([]multipart.FileHeader(nil)) == field
439+
}

‎bind_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,46 @@ func TestFormMultipartBindTwoFiles(t *testing.T) {
11771177
}
11781178
}
11791179

1180+
func TestFormMultipartBindMultipleKeys(t *testing.T) {
1181+
var args struct {
1182+
Files []multipart.FileHeader `form:"files"`
1183+
File multipart.FileHeader `form:"file"`
1184+
}
1185+
1186+
files := []testFile{
1187+
{
1188+
Fieldname: "files",
1189+
Filename: "file1.txt",
1190+
Content: []byte("This is the content of file 1."),
1191+
},
1192+
{
1193+
Fieldname: "files",
1194+
Filename: "file2.txt",
1195+
Content: []byte("This is the content of file 2."),
1196+
},
1197+
}
1198+
file := testFile{
1199+
Fieldname: "file",
1200+
Filename: "file3.txt",
1201+
Content: []byte("This is the content of file 3."),
1202+
}
1203+
1204+
e := New()
1205+
req := createRequestMultipartFiles(t, append(files, file)...)
1206+
rec := httptest.NewRecorder()
1207+
c := e.NewContext(req, rec)
1208+
1209+
err := c.Bind(&args)
1210+
assert.NoError(t, err)
1211+
1212+
assert.Len(t, args.Files, len(files))
1213+
for idx, file := range files {
1214+
argsFile := args.Files[idx]
1215+
assertMultipartFileHeader(t, &argsFile, file)
1216+
}
1217+
assertMultipartFileHeader(t, &args.File, file)
1218+
}
1219+
11801220
func TestFormMultipartBindOneFile(t *testing.T) {
11811221
var args struct {
11821222
File *multipart.FileHeader `form:"file"`

0 commit comments

Comments
 (0)