كيف هو نوع mime من الملف المحمل تحديدها من قبل المتصفح ؟

StackOverflow https://stackoverflow.com/questions/1201945

سؤال

لدي ويب التطبيق حيث يحتاج المستخدم إلى تحميل .ملف مضغوط.على جانب الملقم ، أنا التحقق من mime نوع الملف الذي تم تحميله للتأكد من أنها application/x-zip-compressed أو application/zip.

هذا يعمل بشكل جيد بالنسبة لي في فايرفوكس وإنترنت إكسبلورر.ومع ذلك ، عندما زميل في العمل اختباره ، فإنه فشل في فايرفوكس (رسالة mime نوع كان شيء من هذا القبيل "application/octet-stream") ولكن يعمل على إنترنت إكسبلورر.لدينا الاجهزة يبدو أن تكون متطابقة:IE8, FF 3.5.1 مع جميع إضافات للمعاقين, Win XP SP3, WinRAR مثبت الأصلي .ملف مضغوط معالج (لست متأكدا إذا كان هذا هو ذات الصلة).

لذا سؤالي هو: كيف المتصفح تحديد نوع mime لارسال ؟

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

هل كانت مفيدة؟

المحلول

كروم

كروم (النسخة 38 من الكتابة) لديها 3 طرق لتحديد نوع MIME و لا حتى في ترتيب معين.المقتطف أدناه من الملف src/net/base/mime_util.cc, طريقة MimeUtil::GetMimeTypeFromExtensionHelper.

// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type.  That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.

الثابت تلوينها قوائم تأتي قليلا في وقت سابق في الملف: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings و kSecondaryMappings).

على سبيل المثال:عند تحميل ملف CSV من نظام Windows في Microsoft Excel مثبتا ، وسوف كروم تقرير application/vnd.ms-excel.وهذا لأن .csv لم يتم تحديد في أول الثابت تلوينها قائمة ، وبالتالي فإن المتصفح يعود إلى نظام التسجيل. HKEY_CLASSES_ROOT\.csv له قيمة اسمه Content Type أن يتم تعيين application/vnd.ms-excel.

Internet Explorer

مرة أخرى باستخدام نفس المثال ، فإن المتصفح التقرير application/vnd.ms-excel.أعتقد أنه من المعقول أن نفترض Internet Explorer (النسخة 11 من الكتابة) يستخدم التسجيل.وربما أيضا يجعل من استخدام ترميز-الثابت قائمة مثل كروم و فايرفوكس لكن مغلقة المصدر الطبيعة يجعل من الصعب التحقق منها.

فايرفوكس

كما هو مبين في كروم رمز, فايرفوكس (الإصدار 32 من الكتابة) يعمل بطريقة مماثلة.مقتطف من ملف uriloader\exthandler\nsExternalHelperAppService.cpp, طريقة nsExternalHelperAppService::GetTypeFromExtension

// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category

الثابت تلوينها قوائم تأتي في وقت سابق في ملف في مكان ما بالقرب من خط 441.كنت تبحث عن defaultMimeEntries و extraMimeEntries.

مع الجانبي الحالي ، فإن المتصفح التقرير text/csv لأن هناك دخول في mimeTypes.rdf (البند 2 في القائمة أعلاه).مع الطازجة الشخصية التي لا يكون هذا الدخول ، فإن المتصفح التقرير application/vnd.ms-excel (البند 3 في القائمة).

ملخص

الثابت تلوينها القوائم في المتصفحات محدودة جدا.في كثير من الأحيان ، MIME نوع أرسلت بواسطة المتصفح سوف تكون واحدة ذكرت من قبل نظام التشغيل.وهذا هو بالضبط لماذا ، كما جاء في السؤال ، MIME نوع ذكرت من قبل المتصفح لا يمكن الاعتماد عليها.

نصائح أخرى

كيب قضيت بعض الوقت في قراءة المراجع MSDN و MDN.هنا هو ما يمكن أن نفهم.عندما متصفح لقاءات ملف تحميل ، فإنه يبدو في أول المخزن المؤقت البيانات يتلقى ثم يعمل اختبار على ذلك.هذه الاختبارات في محاولة لتحديد ما إذا كان الملف هو معروف نوع mime أو لا و إذا كان معروفا نوع mime وسوف ببساطة مزيد من الاختبار الذي يعرف نوع mime واتخاذ إجراءات وفقا لذلك.أعتقد أن أي محاولات للقيام بذلك أولا بدلا من مجرد تحديد نوع الملف من امتداد.هذه الصفحة توضح هذه IE http://msdn.microsoft.com/en-us/library/ms775147%28v=vs.85%29.aspx.For firefox, ما أنا يمكن أن نفهم أنه يحاول قراءة معلومات الملف من الملفات أو إدخال دليل ثم يحدد نوع الملف.هنا هو ارتباط FF https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile.أنا لا تزال ترغب في أن يكون أكثر موثوقية المعلومات حول هذا.

وربما هذا هو نظام التشغيل وربما المتصفح يعتمد ، ولكن على ويندوز, MIME نوع معين امتداد الملف يمكن العثور عليها عن طريق البحث في التسجيل تحت HKCR:

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

HKEY_CLASSES_ROOT.zip - ContentType

الذهاب من MIME إلى امتداد الملف, يمكنك أن تنظر في مفاتيح تحت

HKEY_CLASSES_ROOT\Mime\Database\نوع المحتوى

للحصول على الافتراضي امتداد معين نوع MIME.

في حين أن هذا ليس جوابا على سؤالك, فإنه لا يحل المشكلة التي تحاول حلها.YMMV.

كما كتبت نوع mime غير موثوق بها حيث أن كل متصفح لديه طريقة لتحديد ذلك.ومع ذلك ، المتصفحات ترسل الاسم الأصلي (بما في ذلك امتداد) الملف.لذا فإن أفضل طريقة للتعامل مع هذه المشكلة هو فحص الملف بدلا من نوع MIME.

إذا كنت لا تزال في حاجة إلى نوع mime, يمكنك استخدام الخاص بك أباتشي mime.أنواع تحديد ذلك من جانب الخادم.

أنا أتفق مع johndodo, هناك الكثير من المتغيرات التي تجعل من أنواع mime التي يتم إرسالها من المتصفحات لا يمكن الاعتماد عليها.أود أن استبعاد الأنواع التي يتم تلقيها والتركيز فقط على نوع مثل 'تطبيق'.إذا كان التطبيق الخاص بك هو أساس php, يمكنك القيام بذلك بسهولة باستخدام وظيفة تنفجر().وبالإضافة إلى ذلك, مجرد التحقق من امتداد الملف للتأكد من أنه هو .الرمز البريدي أو أي ضغط أخرى كنت تبحث عن!

وفقا rfc1867 - الشكل القائم على تحميل ملف HTML:

كل جزء يجب أن يكون المسمى مع نوع المحتوى الملائم إذا كان نوع وسائط غير معروفة (مثل الاستدلال من امتداد الملف أو نظام التشغيل كتابة المعلومات) أو التطبيق/ثماني بتات-الدفق.

لذلك فهمي ، application/octet-stream هو نوع من مثل blanket catch-all معرف إذا كان نوع لا يمكن الاستدلال.

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