2015-03-31 2 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) 

Как можно заметить, существует обычай загрузки, получить функцию. Это было сделано, чтобы сохранить файл в оригинальном имени, и он работает нормально. Параметр «autodelete = True» установлен для SQLForm. Но поскольку есть пользовательская функция загрузки/загрузки и из-за этого физические файлы не удаляются, когда я удаляю строку из сетки.

Просьба посоветуйте мне об этом, как включить функцию удаления, чтобы всякий раз, когда строка удаляется, физический файл, связанный с ней, также удаляется.

Заранее спасибо.

ответ

1

Функциональность autodelete ожидает, что (a) папка для загрузки является папкой по умолчанию/web2py/applications/yourapp/uploads (или иначе, если указан атрибут «uploadfolder» этого поля) и (b) что значение сохраненный в поле загрузки, является именем файла, которое должно быть добавлено к пути к папке загрузки. Если один или оба из этих условий не выполняется, то вместо него вы должны предоставить пользовательские функции удаления с помощью:

Field(..., custom_delete=your_custom_function) 

Будьте осторожны, используя оригинальное имя файла, так как причина web2py переписывает имя файла, чтобы предотвратить путь атаки обхода. Также обратите внимание, что поведение по умолчанию для web2py сохраняет исходное имя файла (через кодировку).

Смежные вопросы