2011-12-27 3 views
4

나는 FileField를 사용하여 장고에 전자 메일 양식 클래스를 작성했습니다. 업로드 된 파일의 MIME 형식을 확인하여 업로드 된 파일을 확인하고 싶습니다. 그 결과, 파일 형식을 pdfs, word 및 open office 문서로 제한하려고합니다. 이를 위해Django 폼 클린 방법에서 파일 형식을 확인하는 방법은 무엇입니까?

, 나는 파이썬 마법을 설치하고 파이썬 - 마법의 사양에 따라 다음과 같이 파일 형식을 확인하고 싶습니다 :

mime = magic.Magic(mime=True) 
file_mime_type = mime.from_file('address/of/file.txt') 

그러나, 최근에 업로드 된 파일은 내 서버에 주소가 부족합니다. 또한 파일의 내용이 주어진 MIME 유형을 검사하는 "from_file_content"와 비슷한 mime 객체의 메서드에 대해서도 알지 못합니다.

Django 양식에서 업로드 된 파일의 파일 형식을 확인하는 마법을 사용하는 효과적인 방법은 무엇입니까?

답변

4

스탠은 완충제로 양호한 변이체를 기재 하였다. 불행히도이 방법의 약점은 파일을 메모리로 읽는 것입니다. 또 다른 옵션은 temporary stored file을 사용하고 있습니다 :

import tempfile 
import os 

tmp_file_name = request.FILES['my_file_field'].name 
tmp_file_dir = tempfile.gettempdir() # usually /tmp on Unix 
tmp_file_path = os.path.join(tmp_file_dir, tmp_file_name) 

mime = magic.Magic(mime=True) 
file_mime_type = mime.from_file(tmp_file_path) 

# then check mime and raise ValidationError if required 
+0

감사합니다. cleaned_data로 이것을 시도하면 Django는 /tmp/filename.doc 파일이 정의되지 않았 음을 알립니다. 왜 그런 생각이 드나요? – dangerChihuahua007

+0

어떤 방식 으로든 파일이 메모리에로드됩니다. 그리고 임시 경로로 직접 연주하지 않는 편이 더 좋습니다. – Stan

+0

@Chi Zeng보기 및 양식 코드를 제공하십시오. –

4

왜보기에 그런 어떤 시도 뭔가 :

m = magic.Magic() 
m.from_buffer(request.FILES['my_file_field'].read()) 

또는 메모리 좋을 수 :

m.from_buffer(request.FILES['my_file_field'].chunks()) 

죄송합니다 아, 당신이 당신의 양식 유효성 검사의 것을 원하는 것을보고를, 그러나 당신은 cleaned_data 양식의 속성을 사용하여 동일한 작업을 수행해야합니다.

+0

두 번째 코드가 잘못되었습니다. 'multiple_chunks()'는 청크를 리턴하지 않고, 부울을 리턴합니다. 파일이 청크로 분할 될만큼 충분히 큰지 여부. https://docs.djangoproject.com/ko/1.5/topics/http/file-uploads/#django.core.files.uploadedfile.UploadedFile.multiple_chunks – zopieux

+0

@Zopieux : 고맙습니다. – Stan

+1

'from_buffer'는 반복자가 아닌 문자열 버퍼를 기대합니다. AFTERIERIER는'len()'을 가지지 않으므로 새 코드는 AttributeError와 함께 실패합니다. 첫 번째 청크를 수동으로 가져 오는 것 외에는 좋은 해결책이 없습니다. – zopieux

1
mime = magic.Magic(mime=True) 

attachment = request.FILES['attachment'] 

if hasattr(attachment, 'temporary_file_path'): 
    # file is temporary on the disk, so we can get full path of it. 
    mime_type = mime.from_file(attachment.temporary_file_path()) 
else: 
    # file is on the memory 
    mime_type = mime.from_buffer(attachment.read()) 
0

당신은 그 업로드 파일 확장자 경기 그것은 MIME 타입을 검증하기 위해 django-safe-filefield 패키지를 사용할 수 있습니다.

from safe_filefield.forms import SafeFileField 

class MyForm(forms.Form): 

    attachment = SafeFileField(
     allowed_extensions=('xls', 'xlsx', 'csv') 
    )