2015-03-31 58 views
0

這是我的數據庫定義。Web2py SQLForm.grid:刪除用原始名稱保存的上傳文件

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'。但是,由於存在自定義的檢索/下載功能,並且由於當我從網格中刪除一行時,物理文件不會被刪除。

請在此建議我,如何包含刪除功能,以便每當刪除一行時,與其關聯的物理文件也將被刪除。

在此先感謝。

回答

1

autodelete功能期望(a)上傳文件夾是默認的/ web2py/applications/yourapp/uploads文件夾(或者指定字段的「uploadfolder」屬性),以及(b)存儲在上傳字段中的是應附加到上傳文件夾路徑的文件名。如果其中一項或兩項條件都不滿足,那麼你應該改爲提供自定義通過刪除功能:

Field(..., custom_delete=your_custom_function) 

小心使用原來的文件名,如web2py的理由重寫文件名是爲了防止路徑遍歷攻擊。另請注意,web2py的默認行爲確實保留了原始文件名(通過編碼)。

相關問題