Я пишу сервер, который позволит мне загружать файлы размером до 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 Я открыт для предложений, если уже есть решение с открытым исходным кодом, доступное для использования.Я искал один без успеха.