如何使用Flask WTF的FileField实际上传文件

13 投票
3 回答
35565 浏览
提问于 2025-04-17 14:06

在我的 forms.py 文件里,我有

    class myForm(Form):
       fileName = FileField()

在我的 views.py 文件里,我有

    form = myForm()
    if form.validate_on_submit():
        fileName = secure_filename(form.fileName.file.filename)

在我的 .html 文件里,我有

     {% block content %}
     <form action="" method="post" name="simple" enctype="multipart/form-data">
        <p>
           Upload a file
             {{form.fileName()}}
         </p>
        <p><input type="submit" value="Submit"></p>
     </form>
     {% endblock %}

当我点击提交时,这些似乎都能正常工作,但文件并没有出现在任何项目目录里。

3 个回答

13

在表单的文件名上,调用 '.save' 方法。

filename = secure_filename(form.fileName.file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
form.fileName.file.save(file_path)

确保使用 secure_filename() 函数,这样可以防止用户输入一些不安全的文件名,比如 "../../../../home/username/.bashrc" 这样的路径。

使用 os.path.join 可以生成正确的绝对路径,无论你使用的是哪个操作系统。

31

你有没有看过这个:

https://flask.palletsprojects.com/en/2.0.x/patterns/fileuploads/#uploading-files

你需要设置一些配置,比如 UPLOAD_FOLDER 等等。还有,你需要调用 save() 这个函数,但我在你发的 views.py 代码里没看到这个函数。

file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
9

我只需要在 form.fileName.file.save 上调用 .save 方法。

    myFile = secure_filename(form.fileName.file.filename)
    form.fileName.file.save(PATH+myFile)

撰写回答