여러 개의 * .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
더 문제 (및 질문) 아래로 축소 및 샘플 데이터를 제공 고려해 https://stackoverflow.com/help/mcve – handle