سؤال

أعلم أنه يمكنني قبول عمليات تحميل الصور من خلال وجود نموذج ينشر إلى محرك التطبيق مثل:

<form action="/upload_received" enctype="multipart/form-data" method="post">
<div><input type="file" name="img"/></div>
<div><input type="submit" value="Upload Image"></div>
</form>

ثم في رمز Python يمكنني فعل شيء مثل

image = self.request.get("img")

ولكن كيف يمكنني معرفة ما الذي يجب أن يكون عليه نوع المحتوى لهذه الصورة عند عرضها لاحقًا للمستخدم؟ يبدو أن الطريقة الأكثر قوة هي معرفة ذلك من بيانات الصورة نفسها ، ولكن كيفية الحصول على ذلك بسهولة؟ لم أر أي شيء مناسب في حزمة صور google.appengine.api.

هل يجب أن أبحث فقط عن رؤوس الصور السحرية في الكود الخاص بي ، أم أن هناك بالفعل طريقة لذلك في مكان ما؟

يحرر:

فيما يلي الحل التبسيط الذي انتهى به الأمر ، يبدو أنه يعمل بشكل جيد بما يكفي لأغاني ويتجنب الاضطرار إلى تخزين نوع الصورة كحقل منفصل في متجر البيانات:

# Given an image, returns the mime type or None if could not detect.
def detect_mime_from_image_data(self, image):
    if image[1:4] == 'PNG': return 'image/png'
    if image[0:3] == 'GIF': return 'image/gif'
    if image[6:10] == 'JFIF': return 'image/jpeg'
    return None
هل كانت مفيدة؟

المحلول

بدلاً من استخدام self.request.get (fieldName) ، استخدم self.request.post [fieldName]. هذا يعيد كائن CGI.FieldStorage (انظر مستندات مكتبة Python للحصول على التفاصيل) ، التي تحتوي على سمات "اسم الملف" و "النوع" و "القيمة".

نصائح أخرى

جرب وحدة Python Mimetypes ، وسوف تخمن نوع المحتوى وترميز لك ،

على سبيل المثال

>> استيراد محاكاة

>> mimetypes.geess_type ("/home/sean/desktop/comedy/30seconds.mp4")

('video/mp4' ، لا شيء)

استنادًا إلى بحثي ، حدد المتصفحات ، باستثناء Internet Explorer (الإصدار 6 على الأقل) ، نوع ملف الملف باستخدام ملحق الملف. بالنظر إلى أنك تريد أنواع MIME Image ، يمكنك استخدام قاموس Python بسيط من أجل تحقيق ذلك.

لسوء الحظ ، لا أعرف أي طريقة في بيثون تحاول تخمين نوع الصورة من خلال قراءة بعض البايتات السحرية (الطريق معلومات الملف يفعل في PHP). ربما يمكنك تطبيق مبدأ EAFP (أسهل في السؤال عن الإذن) مع Google Appengine Image API.

نعم ، يبدو أن واجهة برمجة تطبيقات الصورة لا تخبرك بنوع الصورة التي قمت بتحميلها. ما سأفعله في هذه الحالة هو بناء هذا قاموس Python لتعيين ملحقات الملفات لأنواع MIME الصور ومحاولة تحميل الصورة مع توقع أ NotImageError() استثناء. إذا سارت الأمور على ما يرام ، فأنا أفترض أن نوع MIME كان على ما يرام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top