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

Dan*_*son 8 streaming http stream go

我有一个客户端发出下载文件的请求,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 ?
})
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 14

您可以使用io.Copy()哪个正是这样做.

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

n, err := io.Copy(w, res.Body)
// check err
Run Code Online (Sandbox Code Playgroud)

另请注意,Copy()不会返回io.EOF但是nil因为它可以"复制"所有内容直到src报告io.EOF,这不被视为错误.