2016-04-18 1 views
0

Привет, Я пытаюсь реализовать сервер Tornado с целью получить очень большие двоичные файлы (~ 1GB) в тело POST. Следующий код работает для небольших файлов, но не отвечает, если я пытаюсь отправить большие файлы (~ 100 МБ).Сервер Tornado не получает большие файлы

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") 

Вы знаете какие-либо решения?

ответ

2

У меня нет реальной реализации в качестве ответа, кроме одного или двух замечаний, которые, надеюсь, указывают на правильное направление.

Прежде всего есть предел 100MB загрузки, который может быть увеличен установкой

self.request.connection.set_max_body_size(size) 

в инициализационном обработчике запроса. (taken from this answer)

Проблема IST, что смерч обрабатывает все загрузки файлов в памяти (и что HTTP не является очень надежным протоколом для обработки больших загрузок файлов.) Это цитата из члена команды tornadoweb с 2014 (see github issue here)

... Вы можете настроить этот предел с max_buffer_size аргумента HTTPServer конструктора, хотя я не думаю, что было бы хорошей идеей к этому больше, чем, скажем 100MB установлен.

В настоящее время Tornado не поддерживает очень большие загрузки файлов. Лучше поддержка подходит (# 1021), а модуль загрузки nginx является популярным обходным решением . Тем не менее, я бы посоветовал не делать 1GBзагрузок в одном HTTP POST в любом случае, потому что только один HTTP имеет хорошую поддержку для возобновления частично заполненной загрузки (в дополнение к вышеупомянутой ошибке). Рассмотрим процесс загрузки многоступенчатый как chunked_upload и commit_chunked_upload Dropbox в (https://www.dropbox.com/developers/core/docs#chunked-upload)

Как сказано я бы рекомендовал сделать одно из следующих действий:

  • если NGNIX можно обрабатывать и маршрутизировать запросы торнадо => смотрите на модуле (see ngnix wiki here)
  • на загрузке NGNIX Если это должно быть простым решение смерча использовать tornado.web.stream_request_body, который поставляется вместе с торнадо 4. этого потоки загруженных файлов на диск вместо того, чтобы сначала получить все в памяти. (see tornado 4 release notes и this solution on stackoverflow)