ब्राउज़र द्वारा निर्धारित अपलोड की गई फ़ाइल का माइम प्रकार कैसे है?


87

मेरे पास एक वेब ऐप है जहां उपयोगकर्ता को .zip फ़ाइल अपलोड करने की आवश्यकता होती है। सर्वर-साइड पर, मैं अपलोड की गई फ़ाइल के माइम प्रकार की जांच कर रहा हूं, यह सुनिश्चित करने के लिए कि यह है application/x-zip-compressedया application/zip

यह फ़ायरफ़ॉक्स और IE पर मेरे लिए ठीक काम किया। हालांकि, जब एक सहकर्मी ने इसका परीक्षण किया, तो यह फ़ायरफ़ॉक्स पर उसके लिए विफल रहा (भेजा गया माइम प्रकार कुछ " application/octet-stream" जैसा था ) लेकिन इंटरनेट एक्सप्लोरर पर काम किया। हमारे सेटअप एक जैसे प्रतीत होते हैं: IE8, FF 3.5.1 सभी ऐड-ऑन विकलांगों के साथ, Win XP SP3, WinRAR देशी के रूप में स्थापित। ज़िप फ़ाइल हैंडलर (यदि यह प्रासंगिक है तो सुनिश्चित नहीं है)।

तो मेरा सवाल है: ब्राउज़र कैसे निर्धारित करता है कि किस प्रकार का माइम भेजना है?

कृपया ध्यान दें: मुझे पता है कि माइम प्रकार ब्राउज़र द्वारा भेजा जाता है और इसलिए, अविश्वसनीय नहीं है। मैं इसे केवल एक सुविधा के रूप में जाँच रहा हूँ - मुख्य रूप से एक गैर-ज़िप फ़ाइल को ज़िप फ़ाइल के रूप में खोलने की कोशिश करने वाले लोगों की तुलना में अधिक अनुकूल त्रुटि संदेश देने के लिए, और (संभवतः भारी) ज़िप फ़ाइल पुस्तकालयों को लोड करने से बचने के लिए।


एप्लिकेशन / ऑक्टेट-स्ट्रीम एक बाइनरी फ़ाइल को नामित करता है। आपको यह देखने के लिए फ़ाइल का एक्सटेंशन प्राप्त करने में सक्षम होना चाहिए कि क्या यह ज़िप फ़ाइल है। बस स्पष्ट करने के लिए, यह आपके लिए एफएफ पर काम करता है, लेकिन आपके सहकर्मी के लिए नहीं?
केविन क्रॉवेल

हां, इसने मेरे लिए दोनों ब्राउज़रों में काम किया
किप

input/@formenctypeया form/@enctypeविशेषताओं पर एक नज़र
tuxSlayer

जवाबों:


72

क्रोम

Chrome (संस्करण 38 लेखन के रूप में) के पास MIME प्रकार निर्धारित करने के 3 तरीके हैं और एक निश्चित क्रम में ऐसा करता है। नीचे दिया गया स्निपेट फ़ाइल 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)।

एक उदाहरण: Microsoft Excel के साथ Windows सिस्टम से CSV फ़ाइल अपलोड करते समय, Chrome इसकी रिपोर्ट करेगा application/vnd.ms-excel। ऐसा इसलिए है क्योंकि .csvपहली हार्ड-कोडेड सूची में निर्दिष्ट नहीं है, इसलिए ब्राउज़र सिस्टम रजिस्ट्री में वापस आ जाता है। HKEY_CLASSES_ROOT\.csvएक मान है जिसका नाम Content Typeसेट है application/vnd.ms-excel

इंटरनेट एक्स्प्लोरर

फिर से उसी उदाहरण का उपयोग करते हुए, ब्राउज़र रिपोर्ट करेगा application/vnd.ms-excel। मुझे लगता है कि इंटरनेट एक्सप्लोरर (लेखन के रूप में 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 प्रकार OS द्वारा रिपोर्ट किया गया एक होगा। और यह वास्तव में ऐसा क्यों है, जैसा कि प्रश्न में कहा गया है, ब्राउज़र द्वारा रिपोर्ट किया गया MIME प्रकार अविश्वसनीय है।


1
धन्यवाद! क्या आपके पास क्रोम स्रोत में हार्ड-कोडित सूची का लिंक है?
किप

@ हाँ, मैंने एक लिंक जोड़ा है। फ़ायरफ़ॉक्स के लिए आधिकारिक (आधिकारिक) ऑनलाइन स्रोत कोड ब्राउज़र नहीं लगता है, मुझे इसे अपने एफ़टीपी सर्वर से डाउनलोड करना होगा।
user247702 15

CSV के लिए ms-excel के रूप में MIME होने से गुस्सा आ रहा है, आश्चर्य है कि यह हार्डकोड सूची में क्यों नहीं है।
क्रिश

यह जानना अच्छा होगा कि क्या 2014 के बाद से माइम-प्रकार का पता लगाने में कुछ अपडेट थे।
विटाली इसव

1
@VitalyIsaev क्रोम कोड पर एक सरसरी नज़र दिखाता है कि यह 2014 के बाद से नहीं बदला है।
user247702

12

किप, मैंने कुछ समय RFC, MSDN और MDN को पढ़ने में बिताया। यहाँ वही है जो मैं समझ सकता था। जब कोई ब्राउज़र अपलोड के लिए किसी फ़ाइल का सामना करता है, तो वह पहले प्राप्त डेटा के बफर को देखता है और फिर उस पर एक परीक्षण चलाता है। ये परीक्षण यह निर्धारित करने का प्रयास करते हैं कि फ़ाइल एक ज्ञात माइम प्रकार है या नहीं, और यदि ज्ञात माइम प्रकार है, तो वह इसे आगे परीक्षण करेगा जिसके लिए ज्ञात माइम प्रकार है और तदनुसार कार्रवाई करें। मुझे लगता है कि IE विस्तार से फ़ाइल प्रकार का निर्धारण करने के बजाय पहले ऐसा करने की कोशिश करता है। यह पृष्ठ IE http://msdn.microsoft.com/en-us/library/ms775147%28v=vs.85%29.aspx के लिए इसे समझाता है । फ़ायरफ़ॉक्स के लिए, जो मैं समझ सकता था कि यह फाइलसिस्टम या निर्देशिका प्रविष्टि से फ़ाइल जानकारी को पढ़ने की कोशिश करता है और फिर फ़ाइल प्रकार निर्धारित करता है। यहाँ FF के लिए एक लिंक है https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsileile। मैं अभी भी इस पर अधिक आधिकारिक जानकारी रखना चाहूंगा।


8

यह संभवतः OS और संभवतः ब्राउज़र पर निर्भर है, लेकिन विंडोज पर, किसी फ़ाइल एक्सटेंशन के लिए MIME प्रकार एचसीआर के तहत रजिस्ट्री में देख कर पाया जा सकता है:

उदाहरण के लिए:

HKEY_CLASSES_ROOT.zip - ContentType

MIME से फ़ाइल एक्सटेंशन तक जाने के लिए, आप नीचे कीज़ देख सकते हैं

HKEY_CLASSES_ROOT \ Mime \ Database \ Content प्रकार

किसी विशेष MIME प्रकार के लिए डिफ़ॉल्ट एक्सटेंशन प्राप्त करने के लिए।


धन्यवाद। दुर्भाग्य से, मेरे और मेरे सहकर्मी दोनों के लिए यह हमारी रजिस्ट्री में सही प्रतीत होता है। मैं यही कारण है कि यह उसके लिए IE में काम किया है लगता है, लेकिन FF अलग ढंग से किसी भी तरह यह हो रही है ... ओह अच्छी तरह :(
किप

5

हालांकि यह आपके प्रश्न का उत्तर नहीं है, लेकिन यह उस समस्या को हल करता है जिसे आप हल करने का प्रयास कर रहे हैं। YMMV।

जैसा कि आपने लिखा है, माइम प्रकार विश्वसनीय नहीं है क्योंकि प्रत्येक ब्राउज़र के पास इसे निर्धारित करने का अपना तरीका है। हालाँकि, ब्राउज़र फ़ाइल का मूल नाम (एक्सटेंशन सहित) भेजते हैं। तो समस्या से निपटने का सबसे अच्छा तरीका MIME प्रकार के बजाय फ़ाइल के विस्तार का निरीक्षण करना है।

यदि आपको अभी भी माइम प्रकार की आवश्यकता है, तो आप इसे सर्वर-साइड निर्धारित करने के लिए अपने स्वयं के एपाचे mime.types का उपयोग कर सकते हैं।


1
विस्तृत करने के लिए परवाह? मेरे अनुभव में ब्राउज़र हमेशा सही मूल फ़ाइल नाम भेजते हैं (एक्सटेंशन के साथ) जबकि MIME प्रकार बहुत भिन्न होते हैं। तो हां, मैं कहूंगा कि यह कहीं अधिक विश्वसनीय है।
जॉन्डोडो

सही बात। मेरा कहने का मतलब था कि अंतिम उपयोगकर्ता वास्तविक प्रकार की परवाह किए बिना कोई भी एक्सटेंशन डाल सकता है, इसलिए उस पर भरोसा नहीं किया जाना चाहिए।
Djizeus

यह सच है, लेकिन इससे कोई फर्क नहीं पड़ता कि आप एक्सटेंशन या MIME प्रकार का उपयोग करते हैं - आपको कभी भी उपयोगकर्ता द्वारा दिए गए इनपुट पर भरोसा नहीं करना चाहिए। लेकिन ओपी ने स्पष्ट रूप से कहा कि वह इस समस्या से अवगत है, इसलिए यह इस प्रश्न का हिस्सा नहीं है। Btw, मैं सराहना करता हूँ अगर आप को हटा दिया (मुझे लगता है कि यह आप से आया था)।
जॉन्डोडो

तुम सही हो, सवाल पर ध्यान नहीं दिया, मेरा बुरा। मैं अपना वोट रद्द कर सकता हूं, लेकिन आपको उसके लिए जवाब (सिस्टम द्वारा लागू) को संपादित करना होगा ...
Djizeus

हां, मैं जॉन्डोडो से सहमत हूं। जैसा कि Stijn ने अपने जवाब में ऊपर बताया, क्रोम और फ़ायरफ़ॉक्स पहले एक्सटेंशन की जांच करते हैं। वे अंत में एक ही काम कर रहे हैं।
जेनिक्स

0

मैं जॉन्डोडो से सहमत हूं, बहुत सारे चर हैं जो माइम प्रकार बनाते हैं जो ब्राउज़रों से अविश्वसनीय रूप से भेजे जाते हैं। मैं प्राप्त उप-योगों को बाहर कर दूंगा और केवल 'एप्लीकेशन' जैसे प्रकार पर ध्यान केंद्रित करूंगा। यदि आपका ऐप php आधारित है, तो आप आसानी से फ़ंक्शन विस्फोट () का उपयोग करके ऐसा कर सकते हैं। इसके अलावा, यह सुनिश्चित करने के लिए फ़ाइल एक्सटेंशन की जांच करें कि यह .zip या कोई अन्य संपीड़न है जिसे आप खोज रहे हैं!


0

Rfc1867 के अनुसार - HTML में फ़ॉर्म-आधारित फ़ाइल अपलोड :

यदि मीडिया प्रकार ज्ञात है (उदाहरण के लिए, फ़ाइल एक्सटेंशन या ऑपरेटिंग सिस्टम टाइपिंग जानकारी से अनुमानित) या एप्लिकेशन / ऑक्टेट-स्ट्रीम के रूप में प्रत्येक भाग को एक उपयुक्त सामग्री-प्रकार के साथ लेबल किया जाना चाहिए।

तो मेरी समझ, पहचानकर्ता application/octet-streamकी तरह है blanket catch-allयदि प्रकार का अनुमान नहीं लगाया जा सकता है


हाँ, मैं यह सब समझता हूँ। सवाल यह था कि ब्राउज़र कैसे अनुमान लगाता है।
किप

हालांकि यह जानने लायक है, है ना? यदि application/octet-streamयह कैच-ऑल है, तो एक और तरीका यह होगा कि यदि यह अनुमान लगाने में सक्षम है, तो ब्राउज़र पर भरोसा करें और यदि आप प्राप्त करते हैं तो अपने स्वयं के सर्वर साइड टेस्ट करें application/octet-stream
माइकबटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.