我想在我的web2py应用程序中选择上传文件。下面是我的代码,但问题是每当我刷新页面时,都会创建一个空副本文件并显示供下载。如何解决?这个问题。请帮助!!
模型:
db.define_table('image',
Field('title'),
Field('file', 'upload'),
format = '%(title)s')
控制器:
def download(): return response.download(request,db)
def link(): return response.download(request,db,attachment=False)
def index():
image_form = FORM(
INPUT(_name='image_title',_type='text'),
INPUT(_name='image_file',_type='file')
)
if image_form.accepts(request.vars,formname='image_form'):
image = db.image.file.store(image_form.vars.image_file.file,image_form.vars.image_file.filename)
id = db.image.insert(file=image,title=image_form.vars.image_title)
images = db().select(db.image.ALL)
return dict(images=images)
视图:
{{extend "layout.html"}}
<form action="" enctype="multipart/form-data" method="post">
<input name="_formname" type="hidden" value="image_form">
<input class="string" name="image_title" type="text" value="">
<input class="upload" name="image_file" type="file">
<input type="submit" value="Submit">
</form>
<ul>
{{for image in images:}}
<li>
<a href="{{=URL(f='link', args=image.file)}}">
<img src="{{=URL(f='link', args=image.file)}}"/>
{{=image.title}}
</a>
<a href="{{=URL(f='download', args=image.file)}}">
[Download]
</a>
</li>
{{pass}}
</ul>
答案 0 :(得分:2)
您不应该刷新通过POST请求的页面,因为浏览器会重新提交数据(这就是浏览器显示警告的原因)。
如果您将表单代码更改为:
image_form.accepts(request.vars, session, formname='image_form')
web2py会自动创建一个&#34; _formkey&#34;表单的标记(防止双重提交以及防止CSRF攻击)。要利用这一点,您还必须包含&#34; _formkey&#34;和&#34; _formname&#34;表单中隐藏的字段,您可以通过在HTML:
表单中包含以下内容来完成{{=image_form.hidden_fields()}}
注意,您的控制器功能需要返回image_form对象,以便在视图中可用。使用这种方法,如果重新提交表单,它将无法验证,因为_formkey标记将不再有效。
另一个选择是在成功提交表单后进行重定向 - 这将通过GET请求自动在浏览器中重新加载页面,因此后续刷新不会触发重新提交:
if image_form.accepts(request.vars, session, formname='image_form'):
image = db.image.file.store(image_form.vars.image_file.file,
image_form.vars.image_file.filename)
id = db.image.insert(file=image,title=image_form.vars.image_title)
redirect(URL('default', 'index'))