1
0
mirror of https://github.com/labstack/echo.git synced 2024-12-22 20:06:21 +02:00

🎨 : add some test case for multipart file

This commit is contained in:
martinpasaribu 2024-10-10 23:37:33 +07:00 committed by Martti T.
parent d1ab8e8544
commit fb769d71b5
2 changed files with 59 additions and 16 deletions

35
bind.go
View File

@ -219,30 +219,26 @@ func (b *DefaultBinder) bindData(destination interface{}, data map[string][]stri
}
// Handle multiple file uploads ([]*multipart.FileHeader, *multipart.FileHeader, []multipart.FileHeader)
if len(files) > 0 {
if len(files) > 0 && isMultipartFile(structField.Type()) {
for _, fileMap := range files {
fileHeaders, exists := fileMap[inputFieldName]
if exists {
if structField.Type() == reflect.TypeOf([]*multipart.FileHeader(nil)) {
if exists && len(fileHeaders) > 0 {
switch structField.Type() {
case reflect.TypeOf([]*multipart.FileHeader(nil)):
structField.Set(reflect.ValueOf(fileHeaders))
continue
} else if structField.Type() == reflect.TypeOf([]multipart.FileHeader(nil)) {
var headers []multipart.FileHeader
for _, fileHeader := range fileHeaders {
headers = append(headers, *fileHeader)
case reflect.TypeOf([]multipart.FileHeader(nil)):
headers := make([]multipart.FileHeader, len(fileHeaders))
for i, fileHeader := range fileHeaders {
headers[i] = *fileHeader
}
structField.Set(reflect.ValueOf(headers))
continue
} else if structField.Type() == reflect.TypeOf(&multipart.FileHeader{}) {
if len(fileHeaders) > 0 {
structField.Set(reflect.ValueOf(fileHeaders[0]))
}
case reflect.TypeOf(&multipart.FileHeader{}):
structField.Set(reflect.ValueOf(fileHeaders[0]))
continue
} else if structField.Type() == reflect.TypeOf(multipart.FileHeader{}) {
if len(fileHeaders) > 0 {
structField.Set(reflect.ValueOf(*fileHeaders[0]))
}
case reflect.TypeOf(multipart.FileHeader{}):
structField.Set(reflect.ValueOf(*fileHeaders[0]))
continue
}
}
@ -434,3 +430,10 @@ func setFloatField(value string, bitSize int, field reflect.Value) error {
}
return err
}
func isMultipartFile(field reflect.Type) bool {
return reflect.TypeOf(&multipart.FileHeader{}) == field ||
reflect.TypeOf(multipart.FileHeader{}) == field ||
reflect.TypeOf([]*multipart.FileHeader(nil)) == field ||
reflect.TypeOf([]multipart.FileHeader(nil)) == field
}

View File

@ -1177,6 +1177,46 @@ func TestFormMultipartBindTwoFiles(t *testing.T) {
}
}
func TestFormMultipartBindMultipleKeys(t *testing.T) {
var args struct {
Files []multipart.FileHeader `form:"files"`
File multipart.FileHeader `form:"file"`
}
files := []testFile{
{
Fieldname: "files",
Filename: "file1.txt",
Content: []byte("This is the content of file 1."),
},
{
Fieldname: "files",
Filename: "file2.txt",
Content: []byte("This is the content of file 2."),
},
}
file := testFile{
Fieldname: "file",
Filename: "file3.txt",
Content: []byte("This is the content of file 3."),
}
e := New()
req := createRequestMultipartFiles(t, append(files, file)...)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
err := c.Bind(&args)
assert.NoError(t, err)
assert.Len(t, args.Files, len(files))
for idx, file := range files {
argsFile := args.Files[idx]
assertMultipartFileHeader(t, &argsFile, file)
}
assertMultipartFileHeader(t, &args.File, file)
}
func TestFormMultipartBindOneFile(t *testing.T) {
var args struct {
File *multipart.FileHeader `form:"file"`