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