Flask表单接收文本框和文件上传

时间:2018-04-03 04:24:00

标签: html forms http flask

我的/templates中有一个HTML表单,它将文本查询和文件上传作为输入。

HTML

    <form action="/submitted" enctype=multipart/form-data method="POST" onsubmit="showDiv('loading')">
      <input type="text" name="query" size="50" required><br>
      <input type="file" id="fileSelect" name="file" accept=".csv">
      <input type="submit" id="query_submit">
   </form>

enctype设置为multipart/form-data时,保存文件可以从烧瓶中运行,但访问request.form会导致400错误,我读错误是由于缺少密钥错误。反之亦然,如果我删除enctype,我会收到400错误,但可以访问包含查询的request.form

@app.route("/submitted", methods=['POST', 'GET'])
def submitted():
    if request.method == 'POST':
        result = request.form

        query = result['query']

        if not result['file']:
            datapath = 'static/iris.csv'
            plot_id = str(uuid.uuid1())
        else:
            f = request.files['file']
            f.save(secure_filename(f.filename))
            filename = secure_filename(f.filename)
            f.save(os.path.join(app.config['UPLOAD_FOLDER'],\
                     filename))

        return render_template("submitted.html")

以相同的形式读取多种输入类型(文本,文件)的正确方法是什么?或者我应该为文件单独表单?

谢谢!

2 个答案:

答案 0 :(得分:1)

我发现了问题。在尝试访问request.form['file']时检查是否没有上传文件。使用接受文件的表单,由于某种原因这是一个关键错误。所以我使用request.files来检查丢失的文件。这是一个有效的/submitted函数。

@app.route("/submitted", methods=['POST', 'GET'])
def submitted():
    if request.method == 'POST':
        result = request.form

        query = result['query']

        if 'file' not in request.files:
            datapath = 'static/iris.csv'
            plot_id = str(uuid.uuid1())
        else:
            f = request.files['file']
            f.save(secure_filename(f.filename))
            filename = secure_filename(f.filename)
            f.save(os.path.join(app.config['UPLOAD_FOLDER'],\
                     filename))

        return render_template("submitted.html")

答案 1 :(得分:0)

在路线/submitted的功能中,您需要使用功能request.files接收文件,使用request.form.get接收常规数据