猿问

如何将 io.ReadCloser 流式传输到 http.ResponseWriter

我有一个客户端发出下载文件的请求,Web 服务器将此请求转发到实际保存该文件的资源服务器。从资源服务器返回的 *http.Response 具有 Body io.ReaderCloser 从资源服务器流式传输文件内容。但是我现在想开始将其写入来自客户端的原始 http.ResponseWriter 中。查看 http.ResponseWriter 接口,它只包含一个 Write 方法,它需要一个字节片,这让我认为将文件内容返回给客户端的唯一方法是将 Body io.ReaderCloser 读入缓冲区,然后将其放入 http.ResponseWriter 的 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 ?

})


冉冉说
浏览 306回答 1
1回答

潇潇雨雨

您可以使用io.Copy()which 来完成此操作。将副本从 src 复制到 dst,直到在 src 上达到 EOF 或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。n, err := io.Copy(w, res.Body) // check err另请注意,Copy()不会返回io.EOF但nil因为如果它可以“复制”所有内容直到src报告io.EOF,则不会被视为错误。
随时随地看视频慕课网APP

相关分类

Go
我要回答