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

使用Flask-WTF的FileField()上传文件并获取文件路径

发布时间:2024-01-17 12:06:20

Flask-WTF是一个方便的扩展,用于在Flask应用程序中使用WTForms库进行表单处理。其中一个功能是FileField(),它允许用户通过Web界面上传文件。

首先,需要安装Flask-WTF库。可以通过以下命令使用pip安装:

pip install Flask-WTF

接下来,创建一个Flask应用程序,并导入所需的模块:

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField
from flask_wtf.file import FileAllowed, FileRequired

然后,配置Flask应用程序:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

接下来,定义一个表单类,使用FileField()接收文件的上传:

class FileUploadForm(FlaskForm):
    file = FileField('Upload file', validators=[FileRequired(), FileAllowed(['csv'], 'CSV files only!')])

上述代码中,'Upload file'是字段的标签,[FileRequired(), FileAllowed(['csv'], 'CSV files only!')]是验证器,确保上传的文件不能为空且必须是.csv文件。

然后,创建一个视图函数,用于呈现表单和处理表单提交:

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    form = FileUploadForm()
    
    if form.validate_on_submit():
        file = form.file.data
        file_path = 'path/to/save/files' + file.filename
        file.save(file_path)
        return 'File uploaded successfully!'
    
    return render_template('upload.html', form=form)

在上述代码中,form.validate_on_submit()用于在表单提交时自动验证数据,并返回True或False。如果表单通过验证,可以通过form.file.data获取上传的文件对象,然后通过file.save(file_path)方法保存文件。请记得替换'path/to/save/files'为你想要保存文件的目录。

最后,创建一个模板文件upload.html,用于呈现表单:

<!DOCTYPE html>
<html>
<head>
    <title>File Upload</title>
</head>
<body>
    
    <h1>Upload a CSV file</h1>
    
    <form method="POST" enctype="multipart/form-data">
        {{ form.hidden_tag() }}
        {{ form.file.label }}<br>
        {{ form.file }}<br><br>
        <input type="submit" value="Upload">
    </form>
    
</body>
</html>

上述代码中,{{ form.hidden_tag() }}用于添加一些隐藏的字段,确保表单的安全性。{{ form.file.label }}用于显示字段的标签,{{ form.file }}用于显示文件选择按钮。

至此,已经完成了使用Flask-WTF的FileField()上传文件并获取文件路径的示例。通过运行Flask应用程序并访问http://localhost:5000/upload,可以看到一个简单的表单,用于上传.csv文件。上传的文件将保存在指定的路径中,并打印出"File uploaded successfully!"消息。

注意:在实际生产环境中,需要进行更多的文件验证和安全性措施。例如,检查文件类型、大小和文件名,以防止恶意文件上传和其他安全漏洞。