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,这不被视为错误.