From 3795aecb6818f0639802168acb8882d7aefc6fae Mon Sep 17 00:00:00 2001 From: jjxu <428192774@qq.com> Date: Fri, 27 Oct 2023 17:12:51 +0800 Subject: [PATCH] update multpart form parser --- parser.go | 48 +++++++++++++++++++++++++++++++++--------------- simpleRequest.go | 2 +- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/parser.go b/parser.go index 6026160..29feccc 100644 --- a/parser.go +++ b/parser.go @@ -9,6 +9,7 @@ package simpleRequest import ( "bytes" "encoding/json" + "fmt" "io" "mime/multipart" "os" @@ -88,32 +89,45 @@ func (f *FormDataParser) Unmarshal(bodyType EntryMark, BodyEntry map[string]any) } func multipartCommonParse(BodyEntry map[string]any) (reader io.Reader, contentType string) { body := &bytes.Buffer{} - writer := multipart.NewWriter(body) + formWriter := multipart.NewWriter(body) for k, sv := range BodyEntry { if strings.Contains(k, FormFilePathKey.string()) { key := k[len(FormFilePathKey):] - path := sv.(string) - filename := filepath.Base(path) - filePart, _ := writer.CreateFormFile(key, filename) - content, err := os.ReadFile(path) + fp := sv.(string) + filename := filepath.Base(fp) + filePart, _ := formWriter.CreateFormFile(key, filename) + content, err := os.ReadFile(fp) if err != nil { panic(err) } _, _ = filePart.Write(content) + + // way 2 + file, err := os.Open(fp) + if err != nil { + panic(err) + } + defer file.Close() + fieldName := k[len(FormFilePathKey.string()):] + formPart, err := formWriter.CreateFormFile(fieldName, filepath.Base(fp)) + if err != nil { + panic(err) + } + if _, err = io.Copy(formPart, file); err != nil { + return + } } else { - switch sv.(type) { + switch multValue := sv.(type) { case string: - strSv, _ := sv.(string) - _ = writer.WriteField(k, strSv) + _ = formWriter.WriteField(k, multValue) case []string: sss, _ := sv.([]string) for _, v := range sss { - _ = writer.WriteField(k, v) + _ = formWriter.WriteField(k, v) } case *multipart.FileHeader: - file, _ := sv.(*multipart.FileHeader) - filePart, _ := writer.CreateFormFile(k, file.Filename) - src, err := file.Open() + filePart, _ := formWriter.CreateFormFile(k, multValue.Filename) + src, err := multValue.Open() if err != nil { panic(err) return @@ -124,13 +138,17 @@ func multipartCommonParse(BodyEntry map[string]any) (reader io.Reader, contentTy panic(err) return } + case []byte: + formWriter.WriteField(k, string(multValue)) + case int: + formWriter.WriteField(k, fmt.Sprintf("%v", multValue)) } } } - err := writer.Close() + err := formWriter.Close() if err != nil { panic(err) } - return body, writer.FormDataContentType() -} + return body, formWriter.FormDataContentType() +} \ No newline at end of file diff --git a/simpleRequest.go b/simpleRequest.go index 3ba32a7..17dcec3 100644 --- a/simpleRequest.go +++ b/simpleRequest.go @@ -262,7 +262,7 @@ func (s *SimpleRequest) initBody() { s.body = parser.Unmarshal(s.BodyEntryMark, s.BodyEntries) fdParser := parser.(*FormDataParser) s.headers.Set("Content-Type", fdParser.ContentType) - + case IsXMLType(contentTypeData): //application/soap+xml ,application/xml var parser, ok = s.bodyEntryParsers[xmlDataType]