файлы, загруженные с помощью декоратора stream_request_body, повреждены - PullRequest
0 голосов
/ 11 марта 2019

Я пишу сервер, который позволит мне загружать файлы размером до 1 ГБ.Я пришел с этим:

import tornado.web
import tornado.ioloop
import tornado.gen

MB = 1024 * 1024
GB = 1024 * MB
TB = 1024 * GB

MAX_STREAMED_SIZE = 1 * GB


@tornado.web.stream_request_body
class MainHandler(tornado.web.RequestHandler):
    def prepare(self):
        self.f = open("test_file", "wb")
        self.request.connection.set_max_body_size(MAX_STREAMED_SIZE)

    def post(self):
        print("upload completed")
        self.f.close()

    def data_received(self, data):
        self.f.write(data)


if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    application.listen(7777)
    tornado.ioloop.IOLoop.instance().start()

Этот код Python должен позволять мне использовать stream_request_body торнадо для загрузки больших файлов на сервер.

Когда я выбираю файл для загрузки, онКажется, это работает.Проблема в том, что, хотя загруженные файлы могут показаться правильными по размеру, они на самом деле повреждены.Я засвидетельствовал это, отправив запрос POST, используя почтальон в двоичном режиме, который включал шейп-файл (то есть файл.shp).Исходный шейп-файл загружается в ArcMap без проблем.Загруженный файл не читается.

Мой вопрос:
Что мне нужно изменить в этом коде, чтобы сервер мог получать большие файлы, а также правильно сохранять эти файлы на жесткий диск?

ОБНОВЛЕНИЕ:
Я попытался использовать diff между исходным файлом и файлом результата загрузки, и они не отличаются .

PS Я открыт для предложений, если уже есть решение с открытым исходным кодом, доступное для использования.Я искал один без успеха.

...