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