在网络编程中,经常用 http.Post 发送文件到远程服务器,可以通过自己构造 multipart/form-data; boundary
来实现。
一般是这么做:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
defer writer.Close()
part, err := writer.CreateFormFile("myFile", "foo.txt")
if err != nil {
return err
}
file, err := os.Open(name)
if err != nil {
return err
}
defer file.Close()
if _, err = io.Copy(part, file); err != nil {
return err
}
http.Post(url, writer.FormDataContentType(), buf)
上面的代码是把整个文件读到 buf
里,当文件很大时,就会占用很多内存。在 golang 里可以使用io.Pipe
来优化内存占用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
r, w := io.Pipe()
m := multipart.NewWriter(w)
go func() {
defer w.Close()
defer m.Close()
part, err := m.CreateFormFile("myFile", "foo.txt")
if err != nil {
return
}
file, err := os.Open(name)
if err != nil {
return
}
defer file.Close()
if _, err = io.Copy(part, file); err != nil {
return
}
}()
http.Post(url, m.FormDataContentType(), r)
本文网址: https://golangnote.com/topic/246.html 转摘请注明来源