2012-02-15 142 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) 
相關問題