有一些关于发布使用于去http.Request
文件的教程,但几乎无一例外地,他们开始像这样:如何将文件上传为流?
file, err := os.Open(path)
if err != nil {
return nil, err
}
fileContents, err := ioutil.ReadAll(file)
这就是说,你读整个文件到内存中,然后将其转换成Buffer
并传递到请求中,这样的事情:
func send(client *http.Client, file *os.File, endpoint string) {
body := &bytes.Buffer{}
io.Copy(body, file)
req, _ := http.NewRequest("POST", endpoint, body)
resp, _ := client.Do(req)
}
如果你想发布一个巨大的文件,并避免将其读入内存,而是蒸文件起来块......你会怎么做?
'* os.File'实现了所需的'io.Reader'的一个例子。所以你基本上可以做'req,_:= http.NewRequest(“POST”,endpoint,file)'。试试看!它不会“大块”,但你避免把它全部放在记忆中。 – ANisus
身体如果一个http.Request是一个简单的io.Reader(有点简化)。只需让你的流和io.Reader。如何使用文件做到这一点取决于您想要实现速率限制,缓冲,重试,分块/范围等的细节。 – Volker