# Uploads
(r"/uploads/create", handlers.UploadsCreateHandler),
+ (r"/uploads/stream", handlers.UploadsStreamHandler),
(r"/uploads/(.*)/sendchunk", handlers.UploadsSendChunkHandler),
(r"/uploads/(.*)/finished", handlers.UploadsFinishedHandler),
(r"/uploads/(.*)/destroy", handlers.UploadsDestroyHandler),
def run(self, port=81):
logging.debug("Going to background")
- http_server = tornado.httpserver.HTTPServer(self, xheaders=True)
+ http_server = tornado.httpserver.HTTPServer(self, xheaders=True,
+ max_body_size=1 * (1024 ** 3))
# If we are not running in debug mode, we can actually run multiple
# frontends to get best performance out of our service.
filename = self.get_argument("filename")
filesize = self.get_argument_int("filesize")
- filehash = self.get_argument("hash")
+ filehash = self.get_argument("hash", None)
with self.db.transaction():
upload = self.backend.uploads.create(filename, filesize,
self.finish(upload.uuid)
+@tornado.web.stream_request_body
+class UploadsStreamHandler(BaseHandler):
+ @tornado.web.authenticated
+ def prepare(self):
+ # Received file size
+ self.size = 0
+
+ upload_uuid = self.get_argument("id")
+
+ # Fetch upload object from database
+ self.upload = self.backend.uploads.get_by_uuid(upload_uuid)
+ if not self.upload:
+ raise tornado.web.HTTPError(404)
+
+ def data_received(self, data):
+ logging.debug("Received chunk of %s bytes" % len(data))
+ self.size += len(data)
+
+ # Write the received chunk to disk
+ with self.db.transaction():
+ self.upload.append(data)
+
+ def put(self):
+ logging.info("Received entire file (%s bytes)" % self.size)
+
+ with self.db.transaction():
+ self.upload.finished()
+
+ self.finish("OK")
+
+
class UploadsSendChunkHandler(BaseHandler):
@tornado.web.authenticated
def post(self, upload_id):