اذهب إلى المحتوى
  • 0

كيفية معرفة نوع الملف المرفوع في جانغو Django؟

Mohssen A Mohssen

السؤال

قمت بعمل إستمارة form وقمت بكتابة الكود التالي للحصول على معلومات عن الملف:

file = request.FILES['filename']

الآن يمكنني الحصول على اسم الملف وحجمه، ولكن لا أعرف كيف أحصل على نوع الملف MIME type، ما هي الطريقة التي يجب إستخدامها لمعرفة نوع الملف في جانغو Django؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

جانغو Django يوفر إمكانية معرفة نوع الملف المرفوع بسهولة مثل معرفة اسم الملف:

file = request.FILES['filename']
file.name           # اسم الملف
file.content_type   # نوع الملف text/html Image/png image/jpeg ...

يُفضل إستخدام هذه الطريقة لأن الملفات المرفوعة غير آمنة وقد يتم تغير صيغة الملف المرفوع من svg إلى إلى png على سبيل المثال وفي هذه الحالة سوف يقوم المتصفح بعرض ملف SVG والذي قد يحتوي على أكواد JavaScript مما يُعرض الموقع إلى ثغرة XSS

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

هذه دالة قد إستخدمتها من قبل في أحد مشاريع الخاصة بي يمكنك فحص نوع الملف المستقبل ومعرفة إمتداده:
الفكرة هي فحص أخر 3 حروف من اسم الملف.
و عمل الدالة كامل فكرته منع رفع ملفات غير مروغوب بها على النظام.

import os

from django.core.exceptions import ValidationError


def validate_is_audio(file):
    global file_is_sported
    try:

        file_name = str(file)
        file_ext = file_name[-4:]

        if file_ext == '.wav': # يمكنك هنا تحديد نوع الملف الذي تريده فقط.
            first_file_check = True
        else:
            print("Unsupported file type.")
            # raise ValidationError('Unsupported file type.')
            first_file_check = False

    except Exception as e:
        first_file_check = False

    #
    if not first_file_check:
        raise ValidationError('Unsupported file type.')
    valid_file_extensions = ['.wav']
    ext = os.path.splitext(file.name)[1]
    if ext.lower() not in valid_file_extensions:
        raise ValidationError('Unacceptable file extension.')

أما لمعرفة حجم الملف:
قم بتمربر الملف عبر هذه الدالة و تفحص الملف عبر الدالة الجاهزة thisFile._size

def handle_uploaded_file(thisFile):
    if thisFile._size > 5242880: # هنا نفحص ان كان حجم الملف أكللا من 5 مبقا
       return "This file is more than 5mb"
    else:
       with open('some/file/' + str(thisFile), 'wb+') as destination:
           for chunk in thisFile.chunks():
               destination.write(chunk)
       return "File has successfully been uploaded"

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

بما ان لديك اسم الملف من المتغير  file  يوجد مكتبة في البايثون لمعرفة نوع الملف Python-Magic سوف تقوم بتنصيبها pip3 install python-magic

بعد ذلك سوف تقوم بإستخدامها من المتغير file يمكن وضع اسم الملف او المسار :

import magic
mime = magic.from_file(file_path, mime=True)

سوف يتم حفظ نوع الملف في المتغير mime  هذا مثال على استخدامها :

mime = magic.from_file('path/to/a_file.jpg', mime=True)
print(mime) #'image/jpg'

هكذا اصبح يُمكنك معرفة نوع الملف من request.FILES['filename'] بإستخدام مكتبة python-magic.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...