2017-05-10 4 views
0

여러 개의 * .gpx 파일을 내 웹 사이트에 한 번에 업로드하기위한 양식과보기를 설정했습니다. 이러한 파일은 폼에서 clean() 메서드를 사용하여 유효성을 검사 한 다음 처리를 위해 함수에 전달한 후 유효성을 검사합니다.clean() 메서드는 POST 양식을 사용하여 파일의 데이터가 손실되도록합니다.

일부 잘못된 파일을 업로드하면 clean() 메서드가 해당 파일을 캐치하여 사용자에게 예상 한대로 알려줍니다.

유효한 파일을 업로드 할 때 파일이 비어있다는 오류 메시지와 함께 처리 기능이 충돌합니다.

clean() 메소드를 주석 처리하면 유효한 파일이 올바르게 업로드됩니다.

clean() 메서드를 실행하는 동안 파일에 무엇이 발생할 수 있습니까? 이 파일의 내용을 읽을 때

def clean(self): 

     file_errors=[] 

     files = list(self.files.getlist('gpx_file')) 

     for f in list(files): 
      #check file has only one full stop in it. 
      if len(f.name.split('.')) != 2: 
       file_errors.append(ValidationError(
        _('%(file_name)s has not been uploaded:'\ 
        'File type is not supported') 
        , params = { 'file_name': f.name } 
        , code = 'file_type') 
        ) 

      #check file doesn't breach the file size listed in settings 
      if f.content_type in settings.DASHBOARD_UPLOAD_FILE_TYPES: 
       if f._size > settings.DASHBOARD_UPLOAD_FILE_MAX_SIZE: 
        file_errors.append(ValidationError(
         _('%(file_name)s has not been uploaded: File too big.'\ 
         'Please keep filesize under %(setting_size)s.'\ 
         'Current filesize %(file_size)s') , 
         params = { 
          'file_name': f.name, 
          'setting_size': filesizeformat(
           settings.DASHBOARD_UPLOAD_FILE_MAX_SIZE), 
          'file_size': filesizeformat(f._size) 
          }, 
         code = 'file_size' 
          ) 
          ) 
      #check it is one of our allowed file types 
      else: 
       file_errors.append(ValidationError(
        _('%(file_name)s has not been uploaded:'\ 
        'File type is not supported') 
        , params = { 'file_name' : f.name } 
        , code = 'file_type' 
        ) 
        ) 
      #next check the file hasn't been uploaded before 
      #generate MD5 
      md5hash = md5() 
      for chunk in f.chunks(): 
       md5hash.update(chunk) 
      file_hash = md5hash.hexdigest() 

      if gpxTrack.objects.filter(file_hash=file_hash).exists(): 
       file_errors.append(ValidationError(
        _('%(file_name)s has not been uploaded as a identical file'\ 
        'has already been uploaded previously'), 
        params = { 'file_name' : f.name }, 
        code = 'file_hash')) 

     #finally raise errors if there are any 
     if len(file_errors) > 0: 
      raise ValidationError(file_errors) 
     else: 
      return files 
+0

더 문제 (및 질문) 아래로 축소 및 샘플 데이터를 제공 고려해 https://stackoverflow.com/help/mcve – handle

답변

1

:

여기
class UploadGpxView(FormView): 
    form_class = UploadGpxForm 
    template_name = 'dashboard/upload.html' # Replace with your template. 
    success_url = reverse_lazy('dashboard:index') # Replace with your URL or reverse(). 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     files = request.FILES.getlist('gpx_file') 
     if form.is_valid(): 
      for f in files: 
       SaveGPXtoPostGIS(f) 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

가 UploadGpxForm 내 청소 방법 : 여기

class UploadGpxForm(forms.Form): 

    gpx_file = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True})) 

내이다 : 여기

은 내 양식입니다 (md5 해시 계산)를 사용하여 파일 객체의 위치를 ​​처음 (0 번째 바이트)으로 이동해야합니다.:

md5hash = md5() 
for chunk in f.chunks(): 
    md5hash.update(chunk) 
file_hash = md5hash.hexdigest() 
f.seek(0) #<-- add this line 
+0

것은, 내가이가 작동하도록하기 위해 노력 해왔다 정말 감사합니다 나이. 그것은 완벽하게 작동했습니다. – Domronic