我有一个客户端发出下载文件的请求,Web服务器将此请求转发到实际保存该文件的资源服务器。*http.从资源服务器返回的响应具有正文 io。阅读器关闭从资源服务器流式传输文件内容。但是我当时想开始将其写入原始http。来自客户端的响应编写器。查看 http。ResponseWriter 接口它只包含一个 Write 方法,该方法需要一段字节,这让我认为将文件内容返回客户端的唯一方法是读取 Body io。ReaderCloseer进入缓冲区,然后将其放入http中。ResponseWriter's 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 或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。
n, err := io.Copy(w, res.Body)
// check err
另请注意,Copy()
不会返回io.EOF
而是nil
因为如果它可以"复制"所有内容直到src
报告io.EOF
,则不被视为错误。