在Go语言中传输大文件

5

客户端发送文件,大小可能超过5G,发送到从服务器,然后从服务器再发送到主服务器。

从服务器会保存临时文件吗?我不希望这种情况发生,因为它会降低上传速度并浪费从服务器的内存。

有什么方法可以避免这种情况?在golang中传输大文件的最佳方式是什么?


1
如果你的从属设备作为中继工作,它可以只有一个有限的缓冲空间(由发送者填充并被接收者连接消耗),并在填满时拒绝接收任何更多数据吗? - 9000
这是一个 HTTP 服务器吗? - Not_a_Golfer
从技术角度来看,翻译如下: "Slave和Master都是HTTP服务器。" - clinyong
1个回答

7
是的,有一种标准的方法可以避免存储和转发的方式:当客户端连接到从服务器时,后者应该打开与主服务器的连接,然后只需将数据从客户端流式传输到那里。通常使用io.Copy()函数来完成这个操作。由于Go具有出色的鸭子类型(duck typing)支持接口,因此它适用于TCP连接和HTTP请求/响应。
(要获得更好的解释,您需要缩小问题范围。)
解决方案的一部分甚至出现在stackoverflow建议的类似问题中,请点击这里

我使用io.copy(),但遇到了错误(内存不足)。 - clinyong
2
@clinyong,但是你已经得到了解释(并且你已经标记它为接受的)。据说你没有遵循那个建议。请在某个地方发布一个最小的代码示例(pastebin.com等)。 - kostix
3
@clinyong,再次强调,io.Copy()只是从给定的io.Reader小块读取数据并将其传输到传递给它的io.Writer。因此,如果出现OOM错误,你的数据很可能会在写入器中累积,而你的任务是找出原因。过度无脑的缓冲是一个相当可能的原因。 - kostix
@clinyong,能否请您分享一下您的io.Pipe代码。我的io.Pipe代码卡住了,没有响应。我正在尝试将3GB的文件上传到服务器。 - Ramkumar D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接