2010-03-11 5 views
7

मैं जेएसएफ के साथ एक फाइल अपलोड विकसित कर रहा हूं।ब्राउज़र-सामग्री के रूप में एप्लिकेशन/ऑक्टेट-स्ट्रीम कब भेजते हैं?

  • फ़ाइल का नाम
  • बाइट्स
  • सामग्री प्रकार के रूप में ब्राउज़र द्वारा प्रस्तुत: आवेदन फाइल के बारे में तीन तारीखों की बचत होती है।

मेरे समस्या यह है कि कुछ फाइलें सामग्री प्रकार के साथ सहेजे जाते है = application/octet-stream भले ही वे *.pdf ओडर *.doc फ़ाइलें हैं।

ब्राउज़र इस तरह के सामग्री प्रकार कब सबमिट करता है?
मैं डेटाबेस को साफ़ करना चाहता हूं इसलिए मुझे यह जानना होगा कि ब्राउजर जानकारी कब गलत है।

+1

हम्म ... मैं फ़ायरफ़ॉक्स को एक खराब MIME प्रकार का उपयोग नहीं कर सकता, भले ही मैं अपने सिस्टम mime.types फ़ाइल को गड़बड़ कर दूं, इसलिए मुझे यकीन नहीं है कि ब्राउज़र-सामग्री शीर्षलेख को पास करने के लिए ब्राउज़र क्या कर सकता है। – Pointy

+0

@ पॉइंट: दुर्भाग्य से केवल एफएफ की तुलना में दुनिया में अधिक ब्राउज़र हैं। उदाहरण के लिए रेडमंड में एक टीम (खांसी) द्वारा विकसित की गई। – BalusC

+0

हां बिल्कुल - अजीब रूप से पर्याप्त है कि मैं उम्मीद करता हूं कि आईईई एमआईएम प्रकार गलत हो, लेकिन इस तरह से नहीं। (मैं उम्मीद करता हूं कि यह एक जेपीईजी फ़ाइल के लिए "एप्लिकेशन/पीडीएफ" प्रदान करेगी जिसका नाम "bogus.pdf" होता है, उदाहरण के लिए।) – Pointy

उत्तर

8

ब्राउज़र द्वारा भेजे गए मूल्य को अनदेखा करें। यह वास्तव में क्लाइंट प्लेटफ़ॉर्म, ब्राउज़र और कॉन्फ़िगरेशन पर निर्भर है।

यदि आप फ़ाइल एक्सटेंशन के आधार पर सामग्री प्रकारों पर पूर्ण नियंत्रण चाहते हैं, तो बेहतर ढंग से ServletContext#getMimeType() का उपयोग करके इसे स्वयं निर्धारित करें।

String mimeType = servletContext.getMimeType(filename); 

डिफ़ॉल्ट माइम प्रकार प्रश्न में servletcontainer की web.xml में definied कर रहे हैं। उदाहरण के लिए टोमकैट, यह /conf/web.xml में स्थित है। आप विस्तार/वेब ऐप्लिकेशन की /WEB-INF/web.xml में यह ओवरराइड कर सकते हैं इस प्रकार है:

<mime-mapping> 
    <extension>xlsx</extension> 
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> 
</mime-mapping> 

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

String mimeType = Magic.getMagicMatch(file, false).getMimeType(); 

ध्यान दें कि यह विश्वसनीय के रूप में सभी Mimetypes का समर्थन नहीं करता: इस प्रकार आप इसे उपयोग कर सकते हैं। आप दोनों दृष्टिकोणों के संयोजन पर भी विचार कर सकते हैं। जैसे अगर कोई शून्य या application/octet-stream देता है, तो दूसरे का उपयोग करें। या यदि दोनों एक अलग लेकिन "मान्य" mimetype देता है, तो JMimeMagic द्वारा लौटाया गया पसंद करते हैं।

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); 

या यदि आप पहले से ही JSF 2.x उपयोग करने के लिए होता है, ExternalContext#getMimeType() बजाय का उपयोग करें:

ओह, मैं लगभग, जोड़ने के लिए JSF में आप ServletContext प्राप्त कर सकते हैं के रूप में इस भूल गया।

2

यह ओएस, ब्राउज़र पर निर्भर करता है, और उपयोगकर्ता ने उन्हें कैसे कॉन्फ़िगर किया है। यह ब्राउजर फ़ाइल फ़ाइलों के स्थानीय प्रकार को निर्धारित करने के तरीके पर आधारित है (उन्हें प्रदर्शित करने के लिए)। अधिकांश ओएस/ब्राउज़र संयोजनों पर यह फ़ाइल के विस्तार पर आधारित होता है, लेकिन कुछ पर इसे अन्य माध्यमों द्वारा निर्धारित किया जा सकता है। (उदाहरण: मैक ओएस पर)

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

संबंधित मुद्दे