【问题标题】:Flask server cannot read file uploaded by POST requestFlask 服务器无法读取 POST 请求上传的文件
【发布时间】:2016-10-20 09:27:07
【问题描述】:

我让我的 React 客户端将带有 fetch api 的文件发布到“/dataset”端点。

import 'whatwg-fetch';

uploadData(csv) {
    this.dataset = csv;

    fetch('/dataset', {
        method: 'POST',
        body: this._fileToFormData(csv)
    }).then(
        (response) => {
            console.log(response);
        }
    ).catch( () => {} );
};

_fileToFormData(file) {
        var formData = new FormData();
        formData.append('file', file);
        return formData
    };

我的 Flask 服务器应该会接收它。

@app.route('/dataset', methods=['POST'])
def dataset():
    print request.get_data()
    csv_data = request.form['file']
    print csv_data
    return '{ "fake_json":100}', 200

但是,csv_data 对象只是一个 unicode 字符串,'[object File]'

代码

print "form:", request.form
print "files:", request.files

返回

ImmutableMultiDict([('file', u'[object File]')])
ImmutableMultiDict([])

如何获取 CSV 文件的实际内容?

=== 编辑:已解决 ===

变量 csv 实际上是单个文件数组,所以我需要将文件提取出来。

【问题讨论】:

  • 您是否尝试过 file.read() 而不是从表单中返回文件对象?我认为它看起来像 csv_data.read() ?
  • 是的,我收到一条错误消息,指出 unicode 对象没有方法 .read :/
  • 您是否尝试过将Content-Type 明确指定为application/x-www-form-urlencodedmultipart/form-data

标签: javascript python reactjs flask fetch-api


【解决方案1】:

上传的文件在request.files 中可用,而不是request.form。这些值是类似文件的对象,因此要获取您需要读取文件的数据。

data = request.files['file'].read()

有关使用上传的一些示例,请参阅 Flask docs


您还需要正确上传文件。 GitHub 的fetch polyfill 有一个使用FormData 正确格式化正文的示例。您必须将单个文件或输入传递给每个对append 的调用。

var input = document.querySelector('input[type="file"]')
var data = new FormData()
data.append('file', input.files[0])

fetch('/dataset', {
  method: 'POST',
  body: data
})

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 2018-12-15
    • 2015-10-26
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多