سؤال

وكيف يمكنني معرفة ما إذا كان ملف مرفوع من قبل المستخدم هو ملف JPG الحقيقي في بيثون (محرك تطبيقات جوجل)؟

وهذا هو إلى أي مدى وصلت حتى الآن:

وسيناريو يتلقى صورة عبر HTML نموذج المشاركة والتي تتم معالجتها بواسطة التعليمات البرمجية التالية

...
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"

لذلك recogniser سريعة ستكون كما يلي:

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

ولكن هذا لن التقاط أي بيانات سيئة في الجسم. إذا كنت ترغب في الاختيار أكثر قوة، قد تتمكن من محاولة تحميله مع PIL . على سبيل المثال:

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

نصائح أخرى

لا حاجة لاستخدام وتثبيت lybrary PIL لهذا، هناك وحدة المعيار imghdr fited وبالضبط لهذا النوع من الاستخدام.

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)

وActualy يعمل هذا بالنسبة لي في أبراج (حتى إذا أنا لم الانتهاء من كل شيء): في القالب ماكو:

${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

وحل أعم هو استخدام بيثون ملزمة ليونكس "ملف" القيادة. لهذا، تثبيت حزمة بيثون السحر. مثال:

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()

استخدم PIL . إذا كان يمكن فتح الملف، انها صورة.

ومن البرنامج التعليمي ...

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

والبايت الأخير من مواصفات ملف JPEG يبدو أن تختلف إلى أبعد من مجرد E0. القبض على الثلاثة الأولى هو "جيدة بما فيه الكفاية" لتوقيع الكشف عن مجريات الأمور لتحديد موثوق ما إذا كان الملف الحياة السياسية في فرنسا. يرجى الرجوع إلى أدناه اقتراح تعديل:

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