2012-02-15 10 views
1

私はpyramidアプリケーションでformencodeを使ってアップロードされたファイルのサイズを検証したいと思います。私が理解する限り、formencode.validators.FormValidator)から継承したクラスを作成し、それをchained_validatorsに置く必要があります。しかし、私はvalidate_pythonメソッドでアップロードされたファイルのサイズを確認する方法を見つけることができません。それも可能ですか?python formencodeを使ってファイルサイズを検証する方法はありますか?

ありがとうございます、Ivan。

答えて

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) 

注)必要はありません全体のデータをINGのを(他の回答を参照してください) - 私は、さらなるコンテンツ検証のためにそれを行いました。

2

あなたはそのバイトをカウントするので、ファイルサイズを確認するには、ファイルオブジェクト自体に(バリで)LEN()を使用することができます。

size = len(fileObj) 
関連する問題