相当于Flask中Django的raw_post_data,用于访问HTML5上传

时间:2012-11-29 02:43:01

标签: html5 flask

我正在尝试使用HTML5 <input type="file"/>将文件上传到运行Flask的服务器。

a decent article解释如何执行此操作。但是,它建议使用以下命令获取已发送到服务器的数据:

PHP: $_SERVER['HTTP_X_FILE_NAME']
Rails: request.env['HTTP_X_FILE_NAME']
Django: request.META['HTTP_X_FILE_NAME']

不幸的是,我不知道Flask中的上述内容。根据我的阅读,我试过:

  1. request.data
  2. request.stream.read()
  3. request.input_stream.read()
  4. request.input_stream.read( request.headers.get('content-type', type=int) or 0)
  5. 不幸的是,似乎没有按预期工作。

    我正在使用Chrome上传文件:

    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/upload/uri', true);
    xhr.send(file);
    

    在Chrome中,在我启动转移后,在开发人员工具中此给定POST的网络传输的标题下,Content-Length设置为文件的大小上传 - 这表明该文件实际上已被发送。

    我想知道如何访问Flask中发送的文件,或者如何更喜欢将HTML5文件发送到服务器。

1 个答案:

答案 0 :(得分:1)

你见过update to the article you reference吗?您现在可以使用FormData,避免以不同于浏览器的方式处理AJAX上传:

引用文章:

var form = document.getElementById('form-id');
var formData = new FormData(form);
  

这个新的FormData实例是您传递send()调用所需的全部内容:

var xhr = new XMLHttpRequest();
// Add any event handlers here...
xhr.open('POST', '/upload/path', true);
xhr.send(formData);
  

这将发送一个Ajax请求,其中包含表单的所有字段,而不仅仅是文件输入。如果还有文本区域,文本字段,复选框或有什么内容,它们也会被发送。您将收听任何可能收听的事件,例如onprogressonreadystatechange