为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
冉冉说 2021-12-07 10:56:21
我有一个客户端发出下载文件的请求,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 clienthttp.HandleFunc("/getFile", func(w http.ResponseWriter, r *http.Request){    res := getFile()    //how can I stream res.Body into w without buffering ?})
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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

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

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

另请注意,Copy()不会返回io.EOFnil因为如果它可以“复制”所有内容直到src报告io.EOF,则不会被视为错误。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信