在Go中高效处理许多大文件的HTTP上传

时间:2018-01-20 04:27:25

标签: http go

可能有一个可以达到的答案,但大多数搜索结果是"处理大型文件上传"用户不知道他们正在做什么或者#34;处理许多上传和#34;答案始终只是解释如何使用多部分请求和/或Flash上​​传器小部件。

我还没有时间筛选Go的HTTP实现,但是,应用程序什么时候有第一次机会看到传入的身体?直到完全收到它?

如果我[不好]决定使用HTTP传输大量数据并发布一个具有几个10千兆字节部分的请求,我是否必须等待处理它之前收到的全部内容或者身体的io.Reader会反复处理吗?

这只是切线相关,但我也无法得到一个明确的答案,我是否可以选择强行关闭中间的连接;是否,即使我关闭它,它将继续在端口上接收它。

非常感谢。

2 个答案:

答案 0 :(得分:3)

在解析标头之后和读取请求主体之前调用应用程序handler。一旦调用处理程序,处理程序就可以读取request body。服务器不会缓冲整个请求主体。

应用程序可以读取文件上传,而无需通过getting a multipart reader缓冲整个请求并迭代这些部分。

应用程序可以使用MaxBytesReader替换请求正文,以在违反指定限制后强制关闭连接。

以上评论是关于标准库中包含的net / http服务器。评论可能不适用于其他服务器。

答案 1 :(得分:0)

虽然我还没有使用GB大小的文件,但我的文件处理策略(主要是我读取和写入S3的内容)是使用https://golang.org/pkg/os/exec/和cmd行实用程序来处理分块a你喜欢的方式。然后通过拖尾文件来阅读和处理,如下所述:Reading log files as they're updated in Go

在我的情况下,网络实用程序可以比我的代码处理它更快地下载数据,所以将它发送到磁盘然后尽可能快地提取它是有意义的,这样我就不会持有我处理时打开一些连接。