如何将io.ReadCloser流式传输到http.ResponseWriter

问题描述 投票:8回答:1

我有一个请求下载文件的客户端,Web服务器将该请求转发到实际保存文件的资源服务器。从资源服务器返回的* http.Response具有Body io.ReaderCloser,流式传输来自资源服务器的文件内容。但是,现在我想开始将其写入来自客户端的原始http.ResponseWriter中。查看http.ResponseWriter接口,它仅包含一个使用一片字节的Write方法,这使我认为将文件内容返回给客户端的唯一方法是将Body io.ReaderCloser读入缓冲区,然后将其放入http.ResponseWriter的Write方法。我不想这样做,因为那是非常低效的,并且最好通过我的Web服务器将其流式传输。这可能吗?

这里有一些代码说明:

getFile() *http.Response {
    //make a request to resource server and return the response object
}

// handle request from client
http.HandleFunc("/getFile", func(w http.ResponseWriter, r *http.Request){
    res := getFile()
    //how can I stream res.Body into w without buffering ?
})
http go stream streaming
1个回答
14
投票

您可以使用io.Copy()来做到这一点。

从src复制到dst,直到src达到EOF或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。

io.Copy()

还请注意,n, err := io.Copy(w, res.Body) // check err 不会返回Copy()而是返回io.EOF,因为如果它可以“复制”所有内容,直到nil报告src,就不会认为是错误。

© www.soinside.com 2019 - 2024. All rights reserved.