Flask/Apache 文件上传的提交按钮

3 投票
2 回答
3384 浏览
提问于 2025-04-18 08:06

我有一个在Apache服务器后面的Flask应用程序,在我的index.html页面上有一个文件上传按钮和一个提交按钮,如下所示:

<form id="package_form" action="" method="POST">
  <div>
    <p>Upload Packages:</p>
    <p><input id="upload_button" type="file" class="btn btn-default btn-xs"></p>
    <p><input id="submit_button" type="submit" class="btn btn-success" value="Upload">
  </div>
</form>

我希望点击提交按钮时能发送一个请求,然后Flask能接收到这个请求并进行文件上传,具体的代码在这个文件里:

from flask import render_template, request, Response, url_for
from app import app
from werkzeug import secure_filename

## uploading specs ##
UPLOAD_FOLDER = '/tmp/'
ALLOWED_EXTENSIONS = set(['deb'])

def allowed_file(filename):
    return '.' in filename and \
    filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

## index page stuff ##
@app.route('/index', methods = ['GET', 'POST'])
def index():
## kerberos username
    secuser = request.environ.get('REMOTE_USER')

    user = { 'nick': secuser }


## file uploading stuff
if request.method == 'POST': 
    file = request.files['file']
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(UPLOAD_FOLDER, filename))
        return redirect(url_for('/index',     
                        filename=filename))

## main return
return render_template("index.html",
    user = user)

文件上传按钮工作得很好,一切都正常,但当我点击提交按钮时却出现了400错误,这说明问题可能出在Flask这边,但我不太确定具体是什么问题。

如果有人能帮忙就太好了 :)

2 个回答

0

当你在表单中添加文件上传的选项时,需要在表单标签里加上 enctype="multipart/form-data" 这个属性。这是为了告诉浏览器,发送数据时要用正确的格式。

1
if request.method == 'POST':
    file = request.files['file']
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join("/tmp/", filename))
<form id="package_form" action="" method="POST">
  <div>
    <p>Upload Packages:</p>
    <p><input id="upload_button" type="file" class="btn btn-default btn-xs" name="file"></p>
    <p><input id="submit_button" type="submit" class="btn btn-success" value="Upload">
  </div>
</form>

这个方法有效!

不过你还需要在index.html里加上这个(给上传按钮加上name="file")

撰写回答