Flask 服务器无法读取 POST 请求上传的文件
Posted
技术标签:
【中文标题】Flask 服务器无法读取 POST 请求上传的文件【英文标题】:Flask server cannot read file uploaded by POST request 【发布时间】: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-urlencoded
或multipart/form-data
?
【参考方案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
)
【讨论】:
以上是关于Flask 服务器无法读取 POST 请求上传的文件的主要内容,如果未能解决你的问题,请参考以下文章
从 Flask-restless 读取数据的 POST 请求
无法使用 Flask 和 Bootstrap-Vue 表单文件输入从 POST 请求中获取文件