الثعبان: معرفة ما اذا كان ملف مرفوع هو JPG
-
06-07-2019 - |
سؤال
وكيف يمكنني معرفة ما إذا كان ملف مرفوع من قبل المستخدم هو ملف 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