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

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

发布时间:2024-01-17 12:08:28

Flask-WTF是Flask的一个扩展,用于处理Web表单的验证和呈现。它提供了一系列的字段类型,包括FileField,可以用于实现文件上传和处理。下面是一个使用FileField()实现文件上传和压缩功能的示例。

1. 导入所需的模块和类:

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
from werkzeug.utils import secure_filename
import os
import zipfile

2. 创建一个Flask应用:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'xxxxx'  # 设置一个密钥用于保护表单数据
app.config['UPLOAD_FOLDER'] = 'uploads'  # 设置上传文件存储目录

3. 创建一个表单类,其中包含一个FileField字段用于接收上传的文件:

class MyForm(FlaskForm):
    file = FileField(validators=[FileRequired()])  # 设置文件字段为必填项

4. 创建一个视图函数,用于处理文件上传和压缩功能:

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()
    if form.validate_on_submit():
        file = form.file.data  # 获取上传的文件
        filename = secure_filename(file.filename)  # 确保文件名安全
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件到指定目录

        # 压缩文件
        zip_filename = os.path.join(app.config['UPLOAD_FOLDER'], 'compressed.zip')
        with zipfile.ZipFile(zip_filename, 'w') as zp:
            zp.write(os.path.join(app.config['UPLOAD_FOLDER'], filename), filename)

        return f'文件上传成功,并已压缩为: {zip_filename}'

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

5. 创建一个HTML模板用于显示表单:

<!DOCTYPE html>
<html>
<head>
    <title>文件上传和压缩</title>
</head>
<body>
    <h1>文件上传和压缩</h1>
    <form method="POST" enctype="multipart/form-data">
        {{ form.csrf_token }}
        {{ form.file.label }} {{ form.file() }}<br><br>
        <input type="submit" value="上传和压缩">
    </form>
</body>
</html>

6. 运行Flask应用:

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

当用户访问应用的根路径时,将显示一个表单,包含一个文件选择框和一个提交按钮。用户可以选择一个文件上传,并点击提交按钮进行文件上传和压缩。上传的文件将被保存到程序的UPLOAD_FOLDER目录中,并以原始文件名保存。同时,上传的文件将被压缩为一个名为"compressed.zip"的压缩文件。

以上是使用Flask-WTF中的FileField()实现文件上传和压缩功能的示例。你可以根据自己的需求进行修改和扩展,如增加文件类型的验证、设置上传文件的最大大小等。