PythonFlask-WTF文件上传和下载示例
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/
