【问题标题】:Tornado server does not receive big filesTornado 服务器收不到大文件
【发布时间】:2016-08-09 21:17:06
【问题描述】:

您好,我正在尝试实现 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")

你知道有什么解决办法吗?

【问题讨论】:

    标签: rest python-3.x tornado


    【解决方案1】:

    我没有真正的实现作为答案,只有一两句话希望指向正确的方向。

    首先有一个 100MB 的上传限制,可以通过设置来增加

    self.request.connection.set_max_body_size(size) 
    

    在请求处理程序的初始化中。 (taken from this answer)

    问题在于 tornado 处理内存中的所有文件上传(并且 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)

    如上所述,我建议执行以下操作之一:

    • 如果 NGNIX 可以处理请求并将请求路由到 tornado=> 看看 在 NGNIX 上传模块 (see ngnix wiki here)
    • 如果必须是普通的龙卷风解决方案,请使用 tornado.web.stream_request_body 附带 tornado 4. 这个 将上传的文件流式传输到磁盘,而不是尝试先获取 它们都在内存中。 (see tornado 4 release notesthis solution on stackoverflow)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多