{"id":"5b4b44cbe2574851","repo":"labstack/echo","slug":"binding-to-multipart-fileheader-struct-is-not-supp","errorCode":null,"errorMessage":"binding to multipart.FileHeader struct is not supported, use pointer to struct","messagePattern":"binding to multipart\\.FileHeader struct is not supported, use pointer to struct","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"bind.go","lineNumber":512,"sourceCode":"}\n\nvar (\n\t// NOT supported by bind as you can NOT check easily empty struct being actual file or not\n\tmultipartFileHeaderType = reflect.TypeFor[multipart.FileHeader]()\n\t// supported by bind as you can check by nil value if file existed or not\n\tmultipartFileHeaderPointerType      = reflect.TypeFor[*multipart.FileHeader]()\n\tmultipartFileHeaderSliceType        = reflect.TypeFor[[]multipart.FileHeader]()\n\tmultipartFileHeaderPointerSliceType = reflect.TypeFor[[]*multipart.FileHeader]()\n)\n\nfunc isFieldMultipartFile(field reflect.Type) (bool, error) {\n\tswitch field {\n\tcase multipartFileHeaderPointerType,\n\t\tmultipartFileHeaderSliceType,\n\t\tmultipartFileHeaderPointerSliceType:\n\t\treturn true, nil\n\tcase multipartFileHeaderType:\n\t\treturn true, errors.New(\"binding to multipart.FileHeader struct is not supported, use pointer to struct\")\n\tdefault:\n\t\treturn false, nil\n\t}\n}\n\nfunc setMultipartFileHeaderTypes(structField reflect.Value, inputFieldName string, files map[string][]*multipart.FileHeader) bool {\n\tfileHeaders := files[inputFieldName]\n\tif len(fileHeaders) == 0 {\n\t\treturn false\n\t}\n\n\tresult := true\n\tswitch structField.Type() {\n\tcase multipartFileHeaderPointerSliceType:\n\t\tstructField.Set(reflect.ValueOf(fileHeaders))\n\tcase multipartFileHeaderSliceType:\n\t\theaders := make([]multipart.FileHeader, len(fileHeaders))\n\t\tfor i, fileHeader := range fileHeaders {","sourceCodeStart":494,"sourceCodeEnd":530,"githubUrl":"https://github.com/labstack/echo/blob/05489dc1730161df26b72d1ae2a3ba6fb8178fc7/bind.go#L494-L530","documentation":"Returned by isFieldMultipartFile when a struct field used for multipart file binding is of type multipart.FileHeader by value. Echo can only bind files to *multipart.FileHeader, []multipart.FileHeader, or []*multipart.FileHeader because with a value-type FileHeader there is no way to distinguish 'no file uploaded' from 'a file uploaded' — a zero-value FileHeader is indistinguishable from a real one. The pointer/slice forms allow a nil check.","triggerScenarios":"Defining type UploadForm struct{ File multipart.FileHeader `form:\"file\"` } and submitting a multipart/form-data request to a handler that calls c.Bind(&UploadForm{}).","commonSituations":"Following an outdated tutorial using multipart.FileHeader by value. Code generators producing non-pointer FileHeader fields.","solutions":["Change the field type to *multipart.FileHeader","For multiple files use []*multipart.FileHeader or []multipart.FileHeader","Alternatively retrieve the file directly with c.FormFile(\"file\") which returns *multipart.FileHeader"],"exampleFix":"// before\ntype UploadForm struct {\n    File multipart.FileHeader `form:\"file\"`\n}\n\n// after\ntype UploadForm struct {\n    File *multipart.FileHeader `form:\"file\"`\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Ensure multipart file fields use pointer types\nfunc checkFileHeaderFields(rt reflect.Type) error {\n    fhType := reflect.TypeFor[multipart.FileHeader]()\n    for i := 0; i < rt.NumField(); i++ {\n        f := rt.Field(i)\n        if f.Type == fhType {\n            return fmt.Errorf(\"field %s: use *multipart.FileHeader, not multipart.FileHeader\", f.Name)\n        }\n    }\n    return nil\n}","tryCatchPattern":"if err := c.Bind(&req); err != nil {\n    if strings.Contains(err.Error(), \"use pointer to struct\") {\n        return echo.NewHTTPError(http.StatusBadRequest, \"file field must use pointer type\")\n    }\n    return err\n}","preventionTips":["Always use *multipart.FileHeader for single-file struct fields","Use []*multipart.FileHeader for multiple files","Alternatively call c.FormFile(name) directly instead of binding"],"tags":["binding","multipart","file-upload","pointer"],"analyzedSha":"05489dc1730161df26b72d1ae2a3ba6fb8178fc7","analyzedAt":"2026-08-04T21:32:47.783Z","schemaVersion":2}