欢迎访问宙启技术站
智能推送

PythonFlask-WTF文件上传和下载示例

发布时间:2023-12-11 06:17:04

Python的Web框架Flask提供了一个方便的方式来处理文件上传和下载。为了实现这个功能,我们需要使用Flask-WTF扩展,该扩展在处理Web表单时提供了更简单的方式。以下是一个文件上传和下载的示例,带有使用例子。

首先,我们需要在Python环境中安装Flask和Flask-WTF,可以通过以下命令来安装:

pip install flask
pip install flask-wtf

然后,我们创建一个名为app.py的Python文件,并导入所需的模块:

from flask import Flask, render_template, request, send_file
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from werkzeug.utils import secure_filename
import os

接下来,我们需要配置Flask的一些基本设置:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

在这里,我们设置了一个秘钥用于表单加密,并指定了一个文件上传的文件夹。同时,我们定义了允许上传的文件类型。

然后,我们创建一个表单类继承自FlaskForm,并添加一个文件字段和一个提交按钮:

class MyForm(FlaskForm):
    file = FileField('Choose File')
    submit = SubmitField('Upload')

现在,我们需要在Flask应用中处理上传和下载的逻辑。首先,我们处理文件上传:

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()
    if form.validate_on_submit():
        file = form.file.data
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return 'File uploaded successfully!'
    return render_template('index.html', form=form)

在这里,我们首先创建一个表单对象,并判断表单是否已经提交。如果是,我们获取上传的文件并检查文件类型是否允许。如果是允许的文件类型,我们将文件保存在指定的目录中。

接着,我们处理文件下载:

@app.route('/download/<filename>', methods=['GET'])
def download(filename):
  return send_file(os.path.join(app.config['UPLOAD_FOLDER'], filename), as_attachment=True)

在这里,我们定义了一个/download/<filename>的路由,可以通过URL访问。在这个路由中,我们使用send_file函数来提供对文件的下载。as_attachment参数设置为True,以便强制浏览器下载文件而不是尝试打开它。

最后,我们创建一个辅助函数来检查文件类型是否允许:

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

这个函数使用了Python的字符串方法rsplit来获取文件扩展名,并检查它是否在允许的文件类型中。

现在,我们可以创建一个HTML模板来呈现表单并进行测试:

<!DOCTYPE html>
<html>
<head>
    <title>File Upload and Download</title>
</head>
<body>
    <form method="POST" enctype="multipart/form-data">
        {{ form.csrf_token }}
        {{ form.file.label }} {{ form.file }}<br>
        {{ form.submit }}
    </form>
</body>
</html>

在这个模板中,我们使用了Flask-WTF的模板渲染功能,用于渲染表单字段和提交按钮。

现在,我们可以启动Flask应用,并在浏览器中访问http://localhost:5000 来测试。

if __name__ == '__main__':
    app.run()

以上是一个简单的文件上传和下载示例,带有使用例子。通过这个示例,我们可以很容易地实现文件上传和下载功能,并且可以扩展到更复杂的应用中。同时,Flask-WTF提供了更便捷的表单处理方式,使我们的开发更加高效。

参考链接:

- Flask官方文档:https://flask.palletsprojects.com/

- Flask-WTF官方文档:https://flask-wtf.readthedocs.io/

- Werkzeug官方文档:https://werkzeug.palletsprojects.com/