1

我正在使用 tornado 6.0.3 创建一个应用程序,并且需要使用 html 表单上传大文件。我如何流式传输文件,例如使用@stream_request_body装饰器来做到这一点?

我创建了一个简单的表单,如下所示:

<form action="{{ reverse_url('upload') }}" method="post" enctype="multipart/form-data">
   {% module xsrf_form_html() %}
   <input class="file" name="filesToUpload" id="filesToUpload" type="file" multiple/>
   <input type="submit" name="submit" value="Upload File(s)"/>
</form>

它重定向到龙卷风处理程序 UploadHandler 并上传(到当前工作目录)选择的文件:

class UploadHandler(BaseHandler):
"""Class. Handles the upload of the file."""
   def post(self):
      files = []

      try:
         files = self.request.files['filesToUpload']
      except:
         pass

      for f in files:
         file = f['filename']
         with open(file, "wb") as out:
            out.write(f['body'])

这可行,但我需要能够处理大文件,所以我无法将文件加载到内存中。因此,我尝试使用@stream_request_body装饰器,并且(除其他外)找到了解决方案,但是一旦添加,@stream_request_body我就会收到以下错误:

回溯(最近一次通话最后):
  _execute 中的文件“/usr/local/lib/python3.6/dist-packages/tornado/web.py”,第 1674 行
    self.check_xsrf_cookie()
  文件“/usr/local/lib/python3.6/dist-packages/tornado/web.py”,第 1516 行,在 check_xsrf_cookie 中
    引发 HTTPError(403,“POST 中缺少'_xsrf' 参数”)
tornado.web.HTTPError:HTTP 403:禁止(POST 中缺少“_xsrf”参数)

然后我发现说我的龙卷风版本不支持流式多部分上传,所以我(因为我使用龙卷风版本 6.0.3)需要将我的表单方法从POST更改为PUT并传递 XSRF 令牌通过 HTTP 标头。但是,html 表单不支持PUT方法,所以我猜我需要以某种方式使用 JavaScript,但我没有太多使用 JavaScript,也没有找到任何关于如何做到这一点的帮助。


所以我的问题是:

  1. 如何使用最新版本的龙卷风,使用PUT和(或任何其他可行的)JavaScript 从表单中流式传输我的文件?
  2. 如何通过 HTTP 标头传递 XSRF 令牌?我还没有找到任何关于如何执行此操作的实际代码示例。

先感谢您!

4

0 回答 0