2012-02-15 4 views
1

Я хотел бы подтвердить размер загруженного файла в приложении Pyramid с помощью formencode. Насколько я понимаю, мне нужно создать класс, унаследованный от formencode.validators.FormValidator), и поместить его в chained_validators. Но я не могу найти способ проверить размер загруженного файла в методе validate_python. Возможно ли это?Есть ли способ проверить размер файла с помощью python formencode?

Заранее спасибо, Иван.

ответ

0

Другой способ сделать это:

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), 
    ] 
1

Конечно, есть, - хотя я делал это с 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) 

Обратите внимание, что для чтения() ИНГ целых данных не должен быть необходимыми (см другого ответа) - I сделал это для дальнейшей проверки содержимого.

2

Вы можете использовать LEN() (в валидатор) на самом файле объекта, чтобы проверить размер файла, так как его подсчета байтов.

size = len(fileObj) 
Смежные вопросы