1package httpclient 2 3import ( 4 "io" 5 "mime/multipart" 6 "net/http" 7) 8 9func (req *RequestData) UploadFile(fieldName string, fileName string, reader io.Reader) (err error) { 10 return req.UploadFileExtra(fieldName, fileName, reader, nil) 11} 12 13func (req *RequestData) UploadFileExtra(fieldName string, fileName string, reader io.Reader, extra map[string]string) (err error) { 14 r, w := io.Pipe() 15 16 writer := multipart.NewWriter(w) 17 18 go func() { 19 var err error 20 21 defer func() { 22 if err == nil { 23 w.Close() 24 } 25 }() 26 27 for k, v := range extra { 28 err = writer.WriteField(k, v) 29 30 if err != nil { 31 w.CloseWithError(err) 32 return 33 } 34 } 35 36 part, err := writer.CreateFormFile(fieldName, fileName) 37 38 if err != nil { 39 w.CloseWithError(err) 40 return 41 } 42 43 defer writer.Close() 44 45 _, err = io.Copy(part, reader) 46 47 if err != nil { 48 w.CloseWithError(err) 49 return 50 } 51 }() 52 53 req.ReqReader = r 54 55 if req.Headers == nil { 56 req.Headers = make(http.Header) 57 } 58 59 req.Headers.Set("Content-Type", writer.FormDataContentType()) 60 61 return 62} 63