使用Flask-WTF中的FileField()实现文件上传和下载功能
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应用中处理文件表单,并将上传的文件保存到指定路径,同时也可以实现文件的下载功能。
