如何流式传输 io.ReadCloseer into a http.响应编写器



我有一个客户端发出下载文件的请求,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,则不被视为错误。

相关内容

  • 没有找到相关文章

最新更新