2012-11-30 25 views
26

में उचित फ़ाइल एक्सटेंशन को निर्धारित करने के लिए कैसे करें मैं एक अमेज़ॅन एस 3 बाल्टी में फाइल अपलोड कर रहा हूं और इनपुटस्ट्रीम और एक स्ट्रिंग तक पहुंच प्राप्त कर रहा हूं जिसमें फ़ाइल का एमआईएमई प्रकार है लेकिन मूल फ़ाइल नाम नहीं है। S3 पर फ़ाइल को धक्का देने से पहले वास्तव में फ़ाइल नाम और एक्सटेंशन बनाने के लिए मेरे ऊपर निर्भर है। क्या एमआईएमई प्रकार से उपयोग करने के लिए उपयुक्त एक्सटेंशन निर्धारित करने के लिए कोई पुस्तकालय या सुविधाजनक तरीका है?जावा

मैंने अपाचे टिका लाइब्रेरी के कुछ संदर्भ देखे हैं, लेकिन यह ओवरकिल जैसा लगता है और मैं इसे अभी तक फ़ाइल एक्सटेंशन का सफलतापूर्वक पता लगाने में सक्षम नहीं हूं। मैं क्या इकट्ठा करने के लिए ऐसा लगता है इस कोड की तरह काम करना चाहिए कर लिया है, लेकिन जब मेरी प्रकार चर "image/jpeg"

MimeType mimeType = null; 
    try { 
     mimeType = new MimeTypes().forName(type); 
    } catch (MimeTypeException e) { 
     Logger.error("Couldn't Detect Mime Type for type: " + type, e); 
    } 

    if (mimeType != null) { 
     String extension = mimeType.getExtension(); 
     //do something with the extension 
    } 
+1

क्या आप वाकई फ़ाइल एक्सटेंशन सेट करने की आवश्यकता है? यदि आप एमआईएमई प्रकार जानते हैं, तो आप इसे उचित 'सामग्री-प्रकार' के साथ S3 पर अपलोड कर सकते हैं, और एक्सटेंशन (आमतौर पर) अप्रासंगिक हो जाता है। – willglynn

+2

आप सही हैं, मैंने अभी जांच की है, और S3 के लिए ऑब्जेक्टमैटाडाटा में सामग्री-प्रकार सेट करना मेरे मामले में चाल है। मैं अभी भी सवाल का जवाब जानना चाहता हूं, ऐसा लगता है कि यह भविष्य में काम में आ सकता है। – rphutchinson

+1

पर्याप्त मेला। फाइल एक्सटेंशन के लिए एमआईएमई प्रकारों का कोई भी एक सही मैपिंग ™ नहीं है - कुछ प्रकारों में कई एक्सटेंशन होते हैं, कुछ एक्सटेंशन में कई प्रकार होते हैं - इसलिए जब मैं डेटा स्टोर का उपयोग कर रहा हूं जो स्वतंत्र रूप से दोनों को जारी रख सकता है, तो मैं केवल वही स्टोर करने की कोशिश करता हूं जो मुझे पता है और अनुमान लगाने से बचना। – willglynn

उत्तर

41

रूप commentors से कुछ इशारा किया है है मैं सिर्फ एक खाली स्ट्रिंग हो रही है से बाहर, mimetypes और फ़ाइल एक्सटेंशन के बीच कोई सार्वभौमिक 1: 1 मैपिंग नहीं है ... कुछ mimetypes एक से अधिक संभव विस्तार है, कई एक्सटेंशन कई mimetypes द्वारा साझा किया जाता है, और कुछ mimetypes कोई विस्तार नहीं है।

जहां भी संभव हो, आप mimetype को संग्रहीत करने और आगे बढ़ने और विस्तार के बारे में भूलने से बेहतर हैं।

यह कहा गया है कि, यदि आप किसी दिए गए mimetype के लिए सबसे आम फ़ाइल एक्सटेंशन प्राप्त करना चाहते हैं, तो Tika जाने का एक अच्छा तरीका है। Apache Tika में माइमटाइप का एक बहुत बड़ा सेट है, जिसके बारे में पता है, और इनमें से कई के लिए यह पता लगाने, सामान्य एक्सटेंशन, विवरण इत्यादि के लिए माइम जादू भी जानता है।

यदि आप किसी जेपीईजी फ़ाइल के लिए सबसे आम एक्सटेंशन प्राप्त करना चाहते हैं, तो के रूप में this Apache Tika unit test में दिखाया गया है तुम सिर्फ तरह कुछ करने की जरूरत है:

MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); 
    MimeType jpeg = allTypes.forName("image/jpeg"); 
    String jpegExt = jpeg.getExtension(); // .jpg 
    assertEquals(".jpg", jpeg.getExtension()); 

कुंजी बात यह है कि आप टीका जार में बंडल है कि सभी Mimetypes की परिभाषा प्राप्त करने के लिए xml फ़ाइल को लोड करने की आवश्यकता है। आप कस्टम Mimetypes के साथ काम किया जा सकता है, तो भी, तो टीका उन का समर्थन करता है, और परिवर्तन लाइन से एक होने की:

TikaConfig config = TikaConfig.getDefaultConfig(); 
    MimeTypes allTypes = config.getMimeRepository(); 

TikaConfig पद्धति का उपयोग करके Mimetypes पाने के लिए करके, टीका भी कस्टम माइम प्रकार defintions के लिए अपने classpath की जाँच करेगा, और उनको भी शामिल करें।