使用io.Copy配合os.File与网络连接实现Golang文件流传输,避免内存溢出。通过HTTP可直接用http.ServeFile或手动设置响应头并流式输出;TCP场景下服务端监听接收连接后发送文件,客户端读取写入本地。示例代码展示HTTP下载处理器及TCP收发逻辑。默认32KB缓冲区可通过io.CopyBuffer自定义增大至64KB提升高延迟网络吞吐,需设置超时机制避免资源占用。关键点包括错误处理、defer释放资源、按场景选协议。完整流程涵盖打开文件、设头、复制数据、关闭连接,适用于大文件高效稳定传输。

在Golang中实现文件流传输,核心是使用io.Copy或io.CopyBuffer配合os.File与网络连接(如net.Conn或http.ResponseWriter),逐块读取文件内容并发送,避免一次性加载大文件到内存。这种方式高效、稳定,适用于HTTP服务、RPC通信或自定义TCP协议场景。
使用HTTP实现文件流下载
通过http.ServeFile可以直接传输文件,但若需自定义响应头或控制传输过程,推荐手动流式输出。
打开本地文件,使用os.Open 设置响应头,告知客户端为文件下载 使用io.Copy将文件内容写入http.ResponseWriter
示例代码:
func downloadHandler(w http.ResponseWriter, r *http.Request) { file, err := os.Open("example.zip") if err != nil { http.Error(w, "文件未找到", http.StatusNotFound) return } defer file.Close() w.Header().Set("Content-Disposition", "attachment; filename=example.zip") w.Header().Set("Content-Type", "application/octet-stream") io.Copy(w, file)}
通过TCP连接传输文件流
在自定义协议或内部服务间传输大文件时,可使用TCP连接进行流式发送。
立即学习“go语言免费学习笔记(深入)”;
服务端监听端口,接收连接 收到请求后打开文件,逐块发送数据 客户端读取数据并写入本地文件
服务端发送文件示例:
conn, _ := listener.Accept()file, _ := os.Open("data.tar.gz")defer file.Close()io.Copy(conn, file)conn.Close()
客户端接收示例:
conn, _ := net.Dial("tcp", "server:8080")out, _ := os.Create("received.tar.gz")defer out.Close()io.Copy(out, conn)conn.Close()
优化传输性能
默认io.Copy使用32KB缓冲区,可使用io.CopyBuffer指定更大缓冲区提升吞吐量,尤其在高延迟网络中有效。
示例:
buffer := make([]byte, 64*1024) // 64KB buffer_, err := io.CopyBuffer(w, file, buffer)
同时注意设置适当的超时机制,防止连接长时间占用资源。
基本上就这些。按实际场景选择HTTP或TCP方式,合理利用缓冲和连接管理,就能稳定实现文件流传输。不复杂但容易忽略细节,比如错误处理和资源释放。
以上就是如何在Golang中实现文件流传输的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1416022.html
微信扫一扫
支付宝扫一扫