【问题标题】:Web2py SQLForm.grid: Removing the uploaded files saved with original nameWeb2py SQLForm.grid:删除以原始名称保存的上传文件
【发布时间】:2015-03-31 04:40:23
【问题描述】:

这是我的数据库定义。

db.define_table('emsAlertTokens',
            Field('emsrelease',default=session.releasefield,writable=False,label=T('Release')),
            Field('emsmachine',default=session.machinefield,writable=False,label=T('Machine')),
            Field('emsstartdate','datetime',default=request.now,label=T('Start Date')),
            Field('emsenddate','datetime',IS_NOT_EMPTY(error_message='Please specify the End Date.'), label=T('End Date')),
            Field('errorgrepfile','upload',requires=IS_NOT_EMPTY(error_message='Please upload a valid error tokens file'),custom_store=ems_file, custom_retrieve=ems_retrieve, autodelete=True, uploadfield=True, uploadfs=None, label=T('Error Tokens')),
            Field('tokenname','string',requires=IS_NOT_EMPTY('What would you call your token file?'),label=T('Token File Name')))

我的控制器:

def setemstoken():
query = (db.emsAlertTokens)
headers = {'emsAlertTokens.emsrelease': 'Release', 'emsAlertTokens.emsmachine': 'Machine', 'emsAlertTokens.emsstartdate':'Start Time', 'emsAlertTokens.emsenddate': 'End Time','emsAlertTokens.errorgrepfile': 'Token File'}
upload = lambda filename: URL("ems_download", args=[filename])
grid = SQLFORM.grid(query=query,headers=headers,create=True, upload=upload,user_signature=True, deletable=True, editable=True, maxtextlength=100, paginate=25,formargs=dict(message_onsuccess='Error Filter Set',message_onfailure='Form has errors. Tokens not accepted.'),onvalidation=emsvalidate)
return dict(grid=grid)

可以注意到有一个自定义下载、检索功能。这样做是为了以原始名称保存文件,并且工作正常。为 SQLForm 设置了参数“autodelete=True”。但是由于有一个自定义检索/下载功能,因此当我从网格中删除一行时,物理文件不会被删除。

请就此向我提出建议,如何包含删除功能,以便每当删除一行时,与之关联的物理文件也会被删除。

提前致谢。

【问题讨论】:

    标签: web2py


    【解决方案1】:

    autodelete 功能需要 (a) 上传文件夹是默认的 /web2py/applications/yourapp/uploads 文件夹(或者指定字段的“uploadfolder”属性),并且 (b)上传字段中存储的值是应附加到上传文件夹路径的文件名。如果不满足其中一个或两个条件,那么您应该通过以下方式提供自定义删除功能:

    Field(..., custom_delete=your_custom_function)
    

    小心使用原始文件名,因为 web2py 重写文件名的原因是为了防止路径遍历攻击。另请注意,web2py 的默认行为确实保留了原始文件名(通过编码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多