您好我正在尝试实现一个Tornado服务器,其目标是在POST主体中接收非常大的二进制文件(~1GB)。以下代码适用于小文件,但如果我尝试发送大文件(~100MB)则无法回答。
class ReceiveLogs(tornado.web.RequestHandler):
def post(self):
file1 = self.request.body
output_file = open('./output.zip', 'wb')
output_file.write(file1)
output_file.close()
self.finish("file is uploaded")
你知道任何解决方案吗?
答案 0 :(得分:2)
我没有一个真正的实现作为答案,但有一两个评论希望指向正确的方向。
首先,有一个100MB的上传限制,可以通过设置
来增加self.request.connection.set_max_body_size(size)
在Request处理程序的初始化中。 (taken from this answer)
问题是龙卷风处理内存中的所有文件上传(并且HTTP不是用于处理大型文件上传的非常可靠的协议。) 这是2014年来自tornadoweb团队成员的引用(see github issue here)
...您可以使用max_buffer_size参数调整此限制 HTTPServer构造函数,虽然我不认为这是一个好主意 将此值设置为大于100MB。
Tornado目前不支持非常大的文件上传。更好 支持即将到来(#1021)并且nginx上传模块很受欢迎 在此期间解决方法。但是,我建议不要做1GB + 在任何情况下都可以在单个HTTP POST中上传,因为单独的HTTP不会 有良好的支持恢复部分完成的上传(在 除上述错误问题外)。考虑一个多步骤 上传过程,如Dropbox的chunked_upload和commit_chunked_upload (https://www.dropbox.com/developers/core/docs#chunked-upload)
如上所述,我建议您执行以下操作之一: