0

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

一篇不错的文章解释了如何做到这一点。但是,它建议使用以下方法获取已发送到服务器的数据:

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

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

  1. 请求数据
  2. request.stream.read()
  3. request.input_stream.read()
  4. request.input_stream.read(request.headers.get('content-type', type=int) or 0)

不幸的是,似乎没有一个按预期工作。

我正在使用 Chrome 上传文件:

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

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

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

4

1 回答 1

1

你看到你引用的文章的更新了吗?您现在可以使用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

于 2012-11-29T21:59:30.113 回答