我有一个请求下载文件的客户端,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 ?
})
您可以使用io.Copy()
来做到这一点。
从src复制到dst,直到src达到EOF或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。
io.Copy()
还请注意,n, err := io.Copy(w, res.Body)
// check err
不会返回Copy()
而是返回io.EOF
,因为如果它可以“复制”所有内容,直到nil
报告src
,就不会认为是错误。