使用curl向Flask上传文件时request.files无FileStorage对象怎么办
问题原因
- 调试方式错误。
request.files是 Werkzeug 封装的ImmutableMultiDict类型对象,它存储的表单文件键值对存放在类的内部存储结构中,并不会暴露在实例的__dict__属性里,直接打印request.files.__dict__自然会输出空字典,哪怕实际已经接收到了上传文件。 - curl 执行目录下不存在
test.dat文件。当 curl 找不到-F参数指定的本地文件时,会静默跳过该参数,发送空的 POST 请求,最终出现request.files、request.form、request.data全为空的现象。
解决方法
- 先确认上传文件存在:在执行 curl 命令的终端执行
ls test.dat,如果提示文件不存在,切换到test.dat所在目录再执行 curl 命令,或者直接在 curl 中写文件的绝对路径,比如curl -F onlyFile=@/home/xxx/test.dat http://192.168.1.25:5000 - 修改 Flask 服务的调试代码,不要访问
__dict__属性,直接打印request.files或者访问对应字段,示例修正代码如下:
from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['POST']) def upload_file(): # 直接打印request.files本身,不要加__dict__ print("接收到的文件对象:", request.files) # 直接取你上传的onlyFile字段 file = request.files.get('onlyFile') if file: print("获取到上传文件,文件名:", file.filename) print("表单内容:", request.form) print("原始请求数据:", request.data) return "" app.run(host='0.0.0.0', port=5000)
修改完成后重启服务,再执行curl请求即可正常获取到上传文件内容。
内容的提问来源于stack exchange,提问作者Jim Stockwell
相关产品推荐
相关产品推荐

