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  }