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

使用Flask-WTF中的FileField()实现文件上传和下载功能

发布时间:2024-01-17 12:03:00

Flask-WTF是一个基于Flask的表单处理插件,其中包含了FileField字段,可以用于实现文件的上传和下载功能。下面是一个使用Flask-WTF中的FileField()实现文件上传和下载功能的例子。

首先,需要安装Flask-WTF插件。可以使用pip命令进行安装:

pip install Flask-WTF

接下来,我们可以创建一个Flask应用,并在应用中使用Flask-WTF插件。首先,需要导入必要的模块和类:

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

然后,我们可以创建一个表单类,该类继承自FlaskForm类,并包含一个FileField和一个SubmitField。FileField可以用于接收用户上传的文件,SubmitField可以用于提交表单:

class UploadForm(FlaskForm):
    file = FileField('Select File')
    submit = SubmitField('Upload')

在创建应用之前,我们还需要指定上传文件的存储位置。可以在应用的配置中设置一个上传文件夹的路径:

app.config['UPLOAD_FOLDER'] = 'uploads'

然后,在应用中,可以定义一个路由函数,用于处理文件上传和下载的逻辑:

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    form = UploadForm()
    if request.method == 'POST' and form.validate_on_submit():
        file = form.file.data  # 获取上传的文件
        filename = secure_filename(file.filename)  # 获取安全的文件名
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件到指定路径
        return 'File uploaded successfully.'

    return render_template('upload.html', form=form)

在路由函数中,首先实例化一个UploadForm对象。然后,对于POST请求的处理逻辑中,我们首先获取上传的文件,然后使用secure_filename()函数获取安全的文件名,在保存文件之前,我们需要确保上传文件夹已存在,然后使用file.save()方法保存文件到指定路径中,并返回成功信息。

最后,我们只需要创建一个HTML模板,并使用Flask-WTF中的form字段显示表单即可:

<!DOCTYPE html>
<html>
<head>
    <title>File Upload</title>
</head>
<body>
    <h1>File Upload</h1>
    <form enctype="multipart/form-data" method="POST" action="/">
        {{ form.file(placeholder="Select File") }}
        {{ form.submit }}
    </form>
</body>
</html>

在执行应用之前,还需要指定一个密钥,可以在应用的配置中设置SECRET_KEY配置项,可以随机生成一个密钥:

app.config['SECRET_KEY'] = 'your_secret_key'

完整的示例代码如下:

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

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['SECRET_KEY'] = 'your_secret_key'

class UploadForm(FlaskForm):
    file = FileField('Select File')
    submit = SubmitField('Upload')

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    form = UploadForm()
    if request.method == 'POST' and form.validate_on_submit():
        file = form.file.data
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return 'File uploaded successfully.'

    return render_template('upload.html', form=form)

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

使用上述代码运行应用后,访问http://localhost:5000/即可看到上传文件的界面。选择一个文件并点击"Upload"按钮,即可将文件上传到指定路径。上传成功后,会显示"File uploaded successfully."的提示信息。

为了实现文件的下载功能,我们可以在应用中添加一个路由函数,用于处理下载文件的请求:

@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

然后,在HTML模板中添加一个下载链接,并将文件名作为参数传递给路由函数:

<!DOCTYPE html>
<html>
<head>
    <title>File Upload</title>
</head>
<body>
    <h1>File Upload</h1>
    <form enctype="multipart/form-data" method="POST" action="/">
        {{ form.file(placeholder="Select File") }}
        {{ form.submit }}
    </form>

    <h2>Files:</h2>
    {% for file in os.listdir(app.config['UPLOAD_FOLDER']) %}
        <a href="/download/{{ file }}">{{ file }}</a><br>
    {% endfor %}
</body>
</html>

在更新了HTML模板后,再次运行应用并访问http://localhost:5000/,可以看到已上传的文件列表和下载链接。点击下载链接即可下载相应的文件。

总结一下,使用Flask-WTF中的FileField()可以方便地实现文件的上传和下载功能。通过使用Flask-WTF插件和FileField字段,我们可以轻松地在Flask应用中处理文件表单,并将上传的文件保存到指定路径,同时也可以实现文件的下载功能。