我尝试将从API接收到的文件通过管道返回给用户,而不必将其全部存储在内存中。我在搜索中遇到了不同的概念/想法,如io.Copy、io.Pipe()等。我不确定哪一个是正确的解决方案。例如,io.Pipe()看起来像是用于某人在现场创建新的读写器,而不是已经存在的读写器。
io.Copy
io.Pipe()
3lxsmp7m1#
io.Copy是实现这一目标的方法,沿着如下:
func pipeReq(rw http.ResponseWriter, req *http.Request) { resp, err := http.Get(".....") if err != nil{ //handle the error return } rw.Header().Set("Content-Type", resp.Header.Get("Content-Type")) rw.Header().Set("Content-Length", resp.Header.Get("Content-Length")) io.Copy(rw, resp.Body) resp.Body.Close() }
//edit:误读了问题,现在修复了代码。
vaj7vani2#
@OneOfOne的答案很好,但有一个小的改进是使用io.CopyBuffer。CopyBuffer与Copy相同,只是它通过提供的缓冲区(如果需要)而不是分配临时缓冲区
io.CopyBuffer
func pipeReq(rw http.ResponseWriter, req *http.Request) { resp, err := http.Get(".....") if err != nil{ //handle the error return } rw.Header().Set("Content-Type", resp.Header.Get("Content-Type")) rw.Header().Set("Content-Length", resp.Header.Get("Content-Length")) buf := make([]byte, 8) if _, err := io.CopyBuffer(rw, resp.Body, buf); err != nil { // handle the error return } resp.Body.Close() }
2条答案
按热度按时间3lxsmp7m1#
io.Copy
是实现这一目标的方法,沿着如下://edit:误读了问题,现在修复了代码。
vaj7vani2#
@OneOfOne的答案很好,但有一个小的改进是使用
io.CopyBuffer
。CopyBuffer与Copy相同,只是它通过提供的缓冲区(如果需要)而不是分配临时缓冲区