Есть ли способ проверить размер файла с помощью форменкода Python?

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

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


person Ivan Gromov    schedule 15.02.2012    source источник


Ответы (3)


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

size = len(fileObj)
person A-Palgy    schedule 04.11.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)

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

person Marco Mariani    schedule 16.02.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),
    ]
person Ivan Gromov    schedule 17.02.2012