/
multipart.go
57 lines (50 loc) · 1010 Bytes
/
multipart.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package multipart
import (
"bytes"
"fmt"
"io"
mp "mime/multipart"
)
func NewFormData() *FormData {
body := &bytes.Buffer{}
w := mp.NewWriter(body)
return &FormData{w, body}
}
type FormData struct {
*mp.Writer
body *bytes.Buffer
}
func (fd *FormData) Body() *bytes.Buffer {
fd.Close()
return fd.body
}
func (fd *FormData) Append(name string, value any, filename ...string) error {
switch v := value.(type) {
case *mp.FileHeader:
return fd.appendFileHeader(name, v)
case string:
return fd.WriteField(name, v)
case []byte:
w, err := fd.CreateFormField(name)
if err != nil {
return err
}
_, err = w.Write(v)
return err
default:
return fmt.Errorf("cannot append value type %t", v)
}
}
func (fd *FormData) appendFileHeader(name string, value *mp.FileHeader) error {
file, err := value.Open()
if err != nil {
return err
}
defer file.Close()
fw, err := fd.CreateFormFile(name, value.Filename)
if err != nil {
return err
}
_, err = io.Copy(fw, file)
return err
}