我想使用formencode在我的金字塔應用程序中驗證上傳文件的大小。據我所知,我需要創建一個繼承自formencode.validators.FormValidator)
的類並將其放到chained_validators
。但我想不出在validate_python
方法中檢查上傳文件大小的方法。它甚至有可能嗎?有沒有辦法使用python formencode驗證文件大小?
在此先感謝,伊萬。
我想使用formencode在我的金字塔應用程序中驗證上傳文件的大小。據我所知,我需要創建一個繼承自formencode.validators.FormValidator)
的類並將其放到chained_validators
。但我想不出在validate_python
方法中檢查上傳文件大小的方法。它甚至有可能嗎?有沒有辦法使用python formencode驗證文件大小?
在此先感謝,伊萬。
另一種方式來做到這一點:
class CheckFileSize(formencode.validators.FormValidator):
__unpackargs__ = ('upload_field', 'max_file_size')
def validate_python(self, value_dict, state):
log.info('test')
if value_dict.get(self.upload_field) is None:
return value_dict
fileobj = getattr(value_dict.get(self.upload_field), 'file', None)
fileobj.seek(0, os.SEEK_END)
if int(fileobj.tell()) > int(self.max_file_size):
raise formencode.Invalid(
_('File too big'),
value_dict, state,
error_dict={self.upload_field:
formencode.Invalid(_('File too big'), value_dict, state)})
return value_dict
class CreateNewCaseForm(formencode.Schema):
...
chained_validators = [
CheckFileSize('file', max_upload_size),
]
肯定是有的 - 雖然我沒有與TurboGears中,它應該與金字塔的工作,以及:荷蘭國際集團的整體數據不應該是必要的
class MyFileValidator(FancyValidator):
def _to_python(self, value, state):
max_size = 10*1024*1024
payload = value.file.read(max_size+1)
# rewind so that the application can access the content
value.file.seek(0)
if len(payload) == max_size:
raise Invalid(u"The file is too big (>10MB)", value, state)
return value
class MySchema(Schema):
my_file = MyFileValidator(not_empty=True)
注意閱讀()(見對方的回答) - 我做了進一步的內容驗證。
您可以將文件對象本身上使用LEN()(在驗證)來檢查文件的大小,因爲其計算的字節數。
size = len(fileObj)