FLask 上传文件 表单一直显示未选择任何文件

学习《Flask Web 开发》这本书。尝试通过表单上传图片做头像,结果发现表单一直显示“未选择任何文件”, 但是图片确实上传保存了。返回个人界面,刷新页面后,头像能出来。多试几次也是一样。
代码思路:用表单获取文件--->存储文件到制定文件夹---将文件路径保存带数据库(User模型下的Column rel_avatar)--->然后在网页模板中显示

相关代码:
forms.py

class UploadForm(FlaskForm):

photo = FileField(validators=[FileAllowed(photos, u'Image only!')])

submit = SubmitField(u'Upload')

views.py

@main.route('/upload', methods=['GET', 'POST'])

def upload_file():

form = UploadForm()

if form.validate_on_submit():

filename = photos.save(form.photo.data)

file_url = photos.url(filename)

current_user.real_avatar = file_url

else:

file_url = None

return render_template('upload.html', form=form, file_url=file_url)

uoload.html

{% extends "base.html" %}

{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Upload{% endblock %}

{% block page_content %}

<div class="page-header">

<h1>Edit Your Profile</h1>

</div>

<form method="POST" enctype="multipart/form-data">

{{ form.hidden_tag() }}

{{ form.photo }}

{% for error in form.photo.errors %}

<span style="color: red;">{{ error }}</span>

{% endfor %}

{{ form.submit }}

</form>

{% endblock %}

user.html

    {% if user.real_avatar %}

<img class="img-rounded profile-thumbnail" src="{{ user.real_avatar }}">

{% else %}

<img class="img-rounded profile-thumbnail" src="{{ user.gravatar(size=256) }}">

{% endif %}

网页图片:
图片描述
图片描述
图片描述

表单上显示未添加,但是返回个人主页刷新一下,图片就出来了。 求指导

回答:

你的问题可以总结为:已经点击上传了,而且确实上传成功了,但是上传后的页面还是显示“未选择任何文件”。

照此问题点回答,先看你的 views.py

@main.route('/upload', methods=['GET', 'POST'])

def upload_file():

form = UploadForm()

if form.validate_on_submit():

filename = photos.save(form.photo.data)

file_url = photos.url(filename)

current_user.real_avatar = file_url

else:

file_url = None

return render_template('upload.html', form=form, file_url=file_url)

看最后一行 return render_template('upload.html', form=form, file_url=file_url),这里明确表示,你上传成功之后,还是要返回原页面,flask 的机制不同于 Javascript ,POST 之后是需要刷新页面的,也就是说你上传之后,刷新了页面,一个崭新的页面等待着你重新上传文件,所以会显示“未选择任何文件”。

如果你想上传页面之后跳转到你的新页面,建议你用如下代码:

@main.route('/upload', methods=['GET', 'POST'])

def upload_file():

form = UploadForm()

if form.validate_on_submit():

filename = photos.save(form.photo.data)

file_url = photos.url(filename)

current_user.real_avatar = file_url

return redirect(url_for('你的user的视图函数')) # 新增加的代码,仅此处增加。

else:

file_url = None

return render_template('upload.html', form=form, file_url=file_url)

最后,送你一个福利,Flask 项目中使用 Bootstrapfileinput,希望对你有所帮助。

以上是 FLask 上传文件 表单一直显示未选择任何文件 的全部内容, 来源链接: utcz.com/a/156371.html

回到顶部