在web2py上传文件

时间:2014-11-18 05:44:45

标签: web2py

我想在我的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>

1 个答案:

答案 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'))