【问题标题】:storing original upload filename (web2py)存储原始上传文件名(web2py)
【发布时间】:2013-12-26 18:39:29
【问题描述】:

我正在尝试做一些简单且记录良好的事情,但它不适用于我的网络应用程序。

基本上我想为上传的文件保存一些额外的属性,比如原始文件名、用户的电子邮件以及上传日期。

现在按照 web2py 文档,我创建了这个提交视图。它几乎是从文档部分here逐字复制的

我有一个控制器 data.py

def submit():

  import datetime

  form = SQLFORM(db.uploads, fields=['up_file'], deletable=True)

  form.vars.up_date = datetime.datetime.now()
  form.vars.username = auth.user.email

  if request.vars.up_file != None:
    form.vars.filename = request.vars.up_file.filename

  if form.process().accepted:
    redirect(URL('data', 'index'))
  elif form.errors:
    response.flash = "form has errors"

和我的 db.py 摘录:

db.define_table('uploads',
    Field('username', 'string'),
    Field('filename', represent = lambda x, row: "None" if x == None else x[:45]),
    Field('up_file', 'upload', uploadseparate=True, requires=[IS_NOT_EMPTY(), IS_UPLOAD_FILENAME(extension=ext_regex)]),
    Field('up_date', 'datetime'), 
    Field('up_size', 'integer', represent= lambda x, row: quikr_utils.sizeof_fmt(x) ), 
    Field('notes', 'text'))

目前验证似乎没有做任何事情,当我提交我的函数时,文件名由于某种原因没有被保存,并且我在其他地方收到错误,因为值为 None

【问题讨论】:

    标签: python web2py


    【解决方案1】:

    你需要做这样的事情:

    数据库:

    db.define_table('t_filetable',
    Field('f_filename', type='string', label=T('File Name')),
    Field('f_filedescription', type='text',
          represent=lambda x, row: MARKMIN(x),
          comment='WIKI (markmin)',
          label=T('Description')),
    Field('f_filebinary', type='upload', notnull=True, uploadseparate=True,
          label=T('File Binary')),
    auth.signature,
    format='%(f_filename)s',
    migrate=settings.migrate)
    

    控制器:(default.py)

    @auth.requires_login()
    def addfile():
        form = SQLFORM(db.t_filetable, upload=URL('download'))
        if form.process(onvalidation=validate_filename).accepted:
            response.flash = 'success'
        elif form.errors:
            response.flash = 'form has errors'
        return dict(form=form)
    
    def validate_filename(form):
        if form.vars.f_filename == "":
            form.vars.f_filename = request.vars.f_filebinary.filename
    

    函数validate_filename 在表单被验证后被调用,所以form.vars 应该可以在这里使用。函数validate_filename 检查form.vars.f_filename 是否有除"" (blank) 以外的任何值;如果没有,它会从 request.vars.f_filebinary 读取文件名并将其分配给 form.vars.f_filename 。这样,您可以允许用户为文件名提供可选字段。如果他们将其留空,然后仅上传文件,则 DB 中的 f_filename 将是原始文件名。

    【讨论】:

      【解决方案2】:

      我尝试将您的代码粘贴到 web2py 中,看看哪里出了问题,它实际上对我有用(至少保存了文件名)。也许问题出在其他地方?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        相关资源
        最近更新 更多