有没有一种方法可以使用python formencode验证文件大小?

有没有一种方法可以使用python formencode验证文件大小?,python,pyramid,formencode,Python,Pyramid,Formencode,我想使用formencode在我的金字塔应用程序中验证上传文件的大小。据我所知,我需要创建一个继承自formencode.validators.FormValidator)的类,并将其放入chained\u validators。但是我想不出用validate\u python方法检查上传文件大小的方法。有可能吗 提前谢谢你,伊万。当然有-虽然我用涡轮齿轮做到了这一点,但它也应该适用于金字塔: class MyFileValidator(FancyValidator): def _to_

我想使用formencode在我的金字塔应用程序中验证上传文件的大小。据我所知,我需要创建一个继承自
formencode.validators.FormValidator)
的类,并将其放入
chained\u validators
。但是我想不出用
validate\u python
方法检查上传文件大小的方法。有可能吗


提前谢谢你,伊万。

当然有-虽然我用涡轮齿轮做到了这一点,但它也应该适用于金字塔:

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)
请注意,不必读取整个数据(参见其他答案)-我这样做是为了进一步验证内容。

另一种方法:

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),
    ]
您可以对文件对象本身使用len()(在验证器中)来检查文件大小,因为它会计算字节

size = len(fileObj)