github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/gin/binding/multipart_form_mapping.go (about) 1 // Copyright 2019 Gin Core Team. All rights reserved. 2 // Use of this source code is governed by a MIT style 3 // license that can be found in the LICENSE file. 4 5 package binding 6 7 import ( 8 "errors" 9 "github.com/hellobchain/newcryptosm/http" 10 "mime/multipart" 11 "reflect" 12 ) 13 14 type multipartRequest http.Request 15 16 var _ setter = (*multipartRequest)(nil) 17 18 // TrySet tries to set a value by the multipart request with the binding a form file 19 func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) { 20 if files := r.MultipartForm.File[key]; len(files) != 0 { 21 return setByMultipartFormFile(value, field, files) 22 } 23 24 return setByForm(value, field, r.MultipartForm.Value, key, opt) 25 } 26 27 func setByMultipartFormFile(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { 28 switch value.Kind() { 29 case reflect.Ptr: 30 switch value.Interface().(type) { 31 case *multipart.FileHeader: 32 value.Set(reflect.ValueOf(files[0])) 33 return true, nil 34 } 35 case reflect.Struct: 36 switch value.Interface().(type) { 37 case multipart.FileHeader: 38 value.Set(reflect.ValueOf(*files[0])) 39 return true, nil 40 } 41 case reflect.Slice: 42 slice := reflect.MakeSlice(value.Type(), len(files), len(files)) 43 isSetted, err = setArrayOfMultipartFormFiles(slice, field, files) 44 if err != nil || !isSetted { 45 return isSetted, err 46 } 47 value.Set(slice) 48 return true, nil 49 case reflect.Array: 50 return setArrayOfMultipartFormFiles(value, field, files) 51 } 52 return false, errors.New("unsupported field type for multipart.FileHeader") 53 } 54 55 func setArrayOfMultipartFormFiles(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { 56 if value.Len() != len(files) { 57 return false, errors.New("unsupported len of array for []*multipart.FileHeader") 58 } 59 for i := range files { 60 setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1]) 61 if err != nil || !setted { 62 return setted, err 63 } 64 } 65 return true, nil 66 }