Есть ли способ проверить размер файла с помощью Python formencode? - PullRequest
1 голос
/ 15 февраля 2012

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

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

Ответы [ 3 ]

2 голосов
/ 04 ноября 2012

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

size = len(fileObj)
1 голос
/ 16 февраля 2012

Конечно, есть - хотя я сделал это с турбонагнетателями, он должен работать и с пирамидой:

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)

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

0 голосов
/ 17 февраля 2012

Еще один способ сделать это:

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