GolangNote

Golang笔记

Golang http.Post 用最小的内存发送大文件

Permalink

在网络编程中,经常用 http.Post 发送文件到远程服务器,可以通过自己构造 multipart/form-data; boundary 来实现。

Golang http.Post 用最小的内存发送大文件

一般是这么做:

Go: multipart
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 来优化内存占用:

Go: 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)

Related articles

Golang http IPv4/IPv6 服务

Golang 的网络服务,如果不指定IPv4 或 IPv6,如果VPS 同时支持 IPv4 和 IPv6,`net.Listen()` 只会监听 IPv6 地址。但这不影响客户端使用 IPv4 地址来访问。...

Golang 把cookie 字符串解析为cookie 结构

在做爬虫时有时候会遇到需要带已登录的 cookie 请求,这个时候最简单的方法是在浏览器登录后,在开发者面板找到cookie 字符串,然后拷贝粘贴。这就面临一个问题需要把cookie 字符串解析成Go 语言 cookie 结构体。...

Write a Comment to "Golang http.Post 用最小的内存发送大文件"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.16.5 Processed in 8ms