문제

사용자가 업로드 한 파일이 Python (Google App Engine)의 실제 JPG 파일인지 확인하려면 어떻게해야합니까?

이것은 내가 지금까지 얼마나 멀리 얻었는지입니다.

스크립트는 HTML Form Post를 통해 이미지를 수신하고 다음 코드로 처리됩니다.

...
incomming_image = self.request.get("img")
image = db.Blob(incomming_image)
...

나는 mimetypes.guess_type를 찾았지만 그것은 나에게는 효과가 없습니다.

도움이 되었습니까?

해결책

확장을 보는 것보다 더 필요한 경우 한 가지 방법은 JPEG 헤더를 읽고 유효한 데이터와 일치하는지 확인하는 것입니다. 이것의 형식은 다음과 같습니다.

Start Marker  | JFIF Marker | Header Length | Identifier
0xff, 0xd8    | 0xff, 0xe0  |    2-bytes    | "JFIF\0"

따라서 빠른 인식자는 다음과 같습니다.

def is_jpg(filename):
    data = open(filename,'rb').read(11)
    if data[:4] != '\xff\xd8\xff\xe0': return False
    if data[6:] != 'JFIF\0': return False
    return True

그러나 이것은 신체에서 나쁜 데이터를 포착하지 못합니다. 더 강력한 점검을 원한다면로드 할 수 있습니다. . 예 :

from PIL import Image
def is_jpg(filename):
    try:
        i=Image.open(filename)
        return i.format =='JPEG'
    except IOError:
        return False

다른 팁

이를 위해 Pil Lybrary를 사용하고 설치할 필요가 없으며, 이런 종류의 사용에 대해 정확히 적합한 Imghdr 표준 모듈이 있습니다.

보다 http://docs.python.org/library/imghdr.html

import imghdr

image_type = imghdr.what(filename)
if not image_type:
    print "error"
else:
    print image_type

스트림의 이미지가 있으므로 스트림 옵션을 사용할 수 있습니다.

image_type = imghdr.what(filename, incomming_image)

실제로 이것은 Pylons에서 저를 위해 작동합니다 (모든 것을 끝내지 않았더라도) : Mako 템플릿에서 :

${h.form(h.url_for(action="save_image"), multipart=True)}
Upload file: ${h.file("upload_file")} <br />
${h.submit("Submit", "Submit")}
${h.end_form()}

업로드 컨트롤에서 :

def save_image(self):
    upload_file = request.POST["upload_file"]
    image_type = imghdr.what(upload_file.filename, upload_file.value)
    if not image_type:
        return "error"
    else:
        return image_type

보다 일반적인 솔루션은 유닉스 "파일"명령에 Python 바인딩을 사용하는 것입니다. 이를 위해 패키지 Python-Magic 패키지를 설치하십시오. 예시:

import magic

ms = magic.open(magic.MAGIC_NONE)
ms.load()
type =  ms.file("/path/to/some/file")
print type

f = file("/path/to/some/file", "r")
buffer = f.read(4096)
f.close()

type = ms.buffer(buffer)
print type

ms.close()

사용 . 파일을 열 수 있다면 이미지입니다.

튜토리얼에서 ...

>>> import Image
>>> im = Image.open("lena.ppm")
>>> print im.format, im.size, im.mode

JPEG 파일 사양의 마지막 바이트는 E0을 초과하는 것으로 보입니다. 처음 세 가지를 캡처하는 것은 파일이 JPEG인지 확실하게 식별하기 위해 휴리스틱 서명의 '충분히 양호하다'입니다. 아래 수정 된 제안을 참조하십시오.

def is_jpg(filename):
    data = open("uploads/" + filename,'rb').read(11)
    if (data[:3] == "\xff\xd8\xff"):
        return True
    elif (data[6:] == 'JFIF\0'): 
        return True
    else:
        return False
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top