存储原始上传文件名(web2py)

时间:2013-12-26 18:39:30

标签: python web2py

我正在尝试做一些简单且记录良好的事情,除非它不能在我的网络应用程序上运行。

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

现在关注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

2 个答案:

答案 0 :(得分:1)

你需要做这样的事情:

DB:

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。这样,您可以允许用户为filename提供可选字段。如果他们将其留空,并且只是上传文件,则DB中的f_filename将是原始文件名。

答案 1 :(得分:0)

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