如何将io.ReadCloser流式传输到golang中的http.ResponseWriter?

时间:2016-01-18 12:56:21

标签: http go stream streaming

我有一个客户端发出下载文件的请求,Web服务器将此请求转发到实际保存该文件的资源服务器。来自资源服务器的* http.Response让Body io.ReaderCloser从资源服务器流式传输文件内容。但是我正处于这样的地步,我想开始将它写入来自客户端的原始http.ResponseWriter。查看http.ResponseWriter接口它只包含一个写入一个字节的Write方法,这让我觉得将文件内容返回给客户端的唯一方法是将Body io.ReaderCloser读入缓冲区然后把它放到http.ResponseWriter的Write方法中。我不想这样做,因为这非常低效,通过我的网络服务器传输它会好得多。这可能吗?

这里有一些代码来说明:

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 ?
})

1 个答案:

答案 0 :(得分:12)

您可以使用io.Copy()来完成此操作。

  

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

n, err := io.Copy(w, res.Body)
// check err

另请注意,Copy()不会返回io.EOF而是nil,因为如果src报告io.EOF之前它可以“复制”所有内容,则不予考虑错误。