2012-02-15 89 views
1

我想使用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) 

注意阅读()(见对方的回答) - 我做了进一步的内容验证。

2

您可以将文件对象本身上使用LEN()(在验证)来检查文件的大小,因为其计算的字节数。

size = len(fileObj) 
相关问题