जावा में एक फ़ाइल का माइम प्रकार प्राप्त करना


336

मैं बस सोच रहा था कि ज्यादातर लोग जावा में एक फ़ाइल से एक माइम प्रकार कैसे प्राप्त करते हैं? अब तक मैंने दो बर्तन आज़माए हैं: JMimeMagic& Mime-Util

पहले ने मुझे स्मृति के अपवाद दिए, दूसरे ने इसकी धाराओं को ठीक से बंद नहीं किया। मैं बस सोच रहा था कि क्या किसी और के पास एक तरीका / पुस्तकालय था जो उन्होंने इस्तेमाल किया और सही तरीके से काम किया?


4
उपलब्ध पुस्तकालयों पर एक अच्छा अवलोकन rgagnon.com/javadetails/java-0487.html
koppor

मैंने उस वर्ग का उपयोग किया जो यहां एक उत्तर के रूप में पोस्ट किया गया था: stackoverflow.com/a/10140531/293280
जोशुआ पिंटर

3
टीका अब जवाब होना चाहिए। नीचे दिए गए अन्य उत्तर, टीका के साथ कई निर्भरता का प्रकाश बनाते हैं, लेकिन मुझे टीका-कोर के साथ कोई नहीं दिखता है।
javamonkey79

@ javamonkey79 जब हम TIka का उपयोग करते हैं, तो यह फाइल को कवर करता है और यह अब उपयोग करने योग्य नहीं है। स्ट्रिंग सामग्रीटाइप = tika.detect (है)।
कूल

जवाबों:


326

जावा 7 में आप अब सिर्फ उपयोग कर सकते हैं Files.probeContentType(path)


62
ज्ञात हो कि Files.probeContentType (पाथ) कई OSes पर छोटी गाड़ी है और बहुत सारी बग रिपोर्ट दर्ज की गई हैं। मुझे ubuntu पर काम करने वाले सॉफ्टवेयर के साथ एक समस्या है, लेकिन विंडोज़ पर असफल। ऐसा लगता था कि विंडोज़ पर फ़ाइलें .probeContentType (पाथ) हमेशा अशक्त होकर लौटती थी। यह मेरा सिस्टम नहीं था इसलिए मैंने JRE या विंडोज़ संस्करण की जाँच नहीं की। यह विंडोज 7 या 8 शायद जावा 7. के लिए ओरेकल जेआरई के साथ था
रजत

13
मैं ओएस एक्स 10.9 पर चल रहा हूँ और मैं nullके लिए बाहर .xml, .pngऔर .xhtmlफ़ाइलें। मुझे नहीं पता कि मैं सिर्फ कुछ गलत कर रहा हूं, लेकिन यह बहुत भयानक लगता है।

36
इसके साथ एक प्रमुख सीमा यह है कि फ़ाइल फ़ाइल सिस्टम पर मौजूद होनी चाहिए। यह स्ट्रीम या बाइट एरे आदि के साथ काम नहीं करता है
नेकरेक्स

3
जब मैं नाम से एक्सटेंशन हटाता हूं, तो यह विधि माइम प्रकार नहीं लौटा सकती है। यदि नाम test.mp4 है तो इसे बाहर निकाल दें, मैं इसे "परीक्षण" में बदल देता हूं और विधि null.Also मैं फिल्म एक्सटेंशन को png आदि में बदल देता हूं। यह पीएनजी माइम प्रकार लौटाता है
सरखान

10
यदि फ़ाइल में कोई गुम या गलत एक्सटेंशन है तो यह बेकार है।
shmosel

215

दुर्भाग्य से,

mimeType = file.toURL().openConnection().getContentType();

काम नहीं करता है, क्योंकि URL का यह उपयोग लॉक की गई फ़ाइल को छोड़ देता है, इसलिए, उदाहरण के लिए, यह अपरिहार्य है।

हालाँकि, आपके पास यह है:

mimeType= URLConnection.guessContentTypeFromName(file.getName());

और यह भी निम्नलिखित है, जो फ़ाइल एक्सटेंशन के मात्र उपयोग से परे जाने का लाभ है, और सामग्री पर एक नज़र रखता है

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
 //...close stream

हालांकि, जैसा कि ऊपर की टिप्पणी द्वारा सुझाया गया है, माइम-प्रकार की अंतर्निहित तालिका काफी सीमित है, उदाहरण के लिए, MSWord और PDF शामिल नहीं है। इसलिए, यदि आप सामान्यीकरण करना चाहते हैं, तो आपको अंतर्निहित पुस्तकालयों से परे जाने की आवश्यकता होगी, उदाहरण के लिए, माइम-यूटिल (जो एक महान पुस्तकालय है, दोनों फ़ाइल एक्सटेंशन और सामग्री का उपयोग करके)।


8
सही समाधान - मुझे बहुत मदद की! रैपिंग FileInputStreamमें BufferedInputStreamअन्यथा - महत्वपूर्ण हिस्सा है guessContentTypeFromStreamरिटर्न null(पारित कर दिया InputStreamउदाहरण के निशान का समर्थन करना चाहिए)
यूरी Nakonechnyy

11
हॉवरवर के URLConnectionपास बहुत सीमित सामग्री प्रकार है जिसे वह पहचानता है। उदाहरण के लिए यह पता लगाने में सक्षम नहीं है application/pdf
कोपचेव

3
यह केवल इसे बंद कर देता है क्योंकि आपने इसे बंद करने का कोई रास्ता नहीं छोड़ा है। URLConnection को डिस्कनेक्ट करने से यह अनलॉक हो जाएगा।
लोर्ने का मार्किस

1
दोनों अनुमाननियंत्रणप्रकारफ़्रीमस्ट्रीम और न ही अंदाज़नप्रत्यक्षप्रकारफ़्राम नाम नहीं पहचानते जैसे mp4
हार्टमुट पी।

3
guessContentTypeFromName()डिफ़ॉल्ट $JAVA_HOME/lib/content-types.propertiesफ़ाइल का उपयोग करता है । आप सिस्टम प्रॉपर्टी को बदलकर अपनी खुद की एक्सटेंडेड फाइल को जोड़ सकते हैंSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
Rasika Perera

50

JAF एपीआई JDK 6. का हिस्सा है javax.activation । पैकेज देखें।

सबसे दिलचस्प कक्षाएं हैं javax.activation.MimeType- एक वास्तविक MIME प्रकार धारक - और javax.activation.MimetypesFileTypeMap- वह वर्ग जिसकी आवृत्ति MIME प्रकार को फ़ाइल के लिए स्ट्रिंग के रूप में हल कर सकती है:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);

4
दुर्भाग्य से, getContentType(File)राज्यों के लिए javadoc के रूप में : फ़ाइल ऑब्जेक्ट का MIME प्रकार लौटाता है getContentType(f.getName())। इस वर्ग में कार्यान्वयन कॉल करता है ।
मटियास

3
और याद रखें कि आप इस कार्यक्षमता को META-INF / mime.types फ़ाइल के साथ बढ़ा सकते हैं, इसलिए यह सही है यदि आप जावा 6 का उपयोग करने के लिए मजबूर हैं। docs.oracle.com/javaee/5/api/javax/activation/…
चेपपिर

8
आप एक नई वस्तु बना सकते हैंMimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
akostadinov

आपके उत्तर के लिए धन्यवाद। यह मेरे लिए सफलतापूर्वक काम कर रहा है।
रादडिया निकुंज

लेकिन यह अभी भी केवल फ़ाइल नाम के आधार पर सामग्री प्रकार लौटाता है। और यह उपयोगकर्ताओं द्वारा अपलोड की गई फ़ाइलों के लिए विशेष रूप से खतरनाक है।
सर्गेई

47

Apache Tika के साथ आपको कोड की केवल तीन लाइनें चाहिए :

File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));

यदि आपके पास एक ग्रूवी कंसोल है, तो बस इसके साथ खेलने के लिए इस कोड को पेस्ट करें और चलाएं:

@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;

def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)

ध्यान रखें कि इसके एपीआई समृद्ध हैं, यह "कुछ भी" को पार्स कर सकता है। Tika-core 1.14 के अनुसार, आपके पास:

String  detect(byte[] prefix)
String  detect(byte[] prefix, String name)
String  detect(File file)
String  detect(InputStream stream)
String  detect(InputStream stream, Metadata metadata)
String  detect(InputStream stream, String name)
String  detect(Path path)
String  detect(String name)
String  detect(URL url)

अधिक जानकारी के लिए apidocs देखें ।


1
यह सीएसवी के लिए काम नहीं करता है। WTF? stackoverflow.com/questions/46960231/…
gstackoverflow

1
टीका के बारे में एक बुरी बात, बहुत सारी निर्भरता प्रस्फुटित होती है। इसने मेरे जार के आकार को 54MB बढ़ा दिया !!!
हेमी

1
@helmyTika 1.17 स्टैंडअलोन है और केवल 648 KB बड़ा है।
संतन

... या new Tika().detect(file.toPath())फ़ाइल की सामग्री के आधार पर पता लगाने के बजाय फ़ाइल के एक्सटेंशन आधारित पहचान के लिए
Lu55

@ Lu55 डॉक्स का कहना है कि अभी भी दस्तावेज़ सामग्री का उपयोग करता है। मुझे लगता है कि आप मतलब है new Tika().detect(file.getPath()), जो केवल फ़ाइल एक्सटेंशन का उपयोग करता है
delucasvb

31

Apache Tika , कोर- उपसर्ग में जादू मार्करों के आधार पर टिक-कोर में एक माइम प्रकार का पता लगाने की पेशकश करती है। tika-coreअन्य निर्भरताओं को नहीं लाते हैं, जो इसे हल्के बनाता है जैसा कि वर्तमान में अनइंस्टॉल किए गए माइम टाइप डिटेक्शन यूटिलिटी

चर का उपयोग करते हुए सरल कोड उदाहरण (जावा 7) theInputStreamऔरtheFileName

try (InputStream is = theInputStream;
        BufferedInputStream bis = new BufferedInputStream(is);) {
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
    MediaType mediaType = detector.detect(bis, md);
    return mediaType.toString();
}

कृपया ध्यान दें कि MediaType.detect (...) का उपयोग सीधे ( TIKA-1120 ) नहीं किया जा सकता है । अधिक संकेत https://tika.apache.org/0.10/detection.html पर दिए गए हैं ।


1
+1 भी Metadata.RESOURCE_NAME_KEYछोड़ा जा सकता है (यदि आपके पास कोई भी नहीं है या मूल नाम पर भरोसा नहीं कर सकता है), लेकिन उस स्थिति में आपको कुछ मामलों में गलत परिणाम मिलेगा (उदाहरण के लिए कार्यालय दस्तावेज़)।
user1516873

अगर फ़ाइल नाम पर कोई विस्तार नहीं है तो XLSX का पता लगाने में कुछ समस्याएं हैं ... लेकिन यह समाधान सरल और सुरुचिपूर्ण है।
ऑस्कर पेरेस

23

यदि आप एक Android डेवलपर हैं, तो आप एक उपयोगिता वर्ग का उपयोग कर सकते हैं android.webkit.MimeTypeMap जो एक्सटेंशन और फ़ाइल को मैप करने के लिए MIME- प्रकार का मैप करता है।

निम्नलिखित कोड स्निपेट आपकी सहायता कर सकते हैं।

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

3
यह भी काम करता है अगर स्थानीय फ़ाइल पथ जैसे "/sdcard/path/to/video.extension" के साथ प्रयास किया जाता है। समस्या यह है कि यदि स्थानीय फ़ाइल में पथ में जगह है, तो यह हमेशा अशक्त रहता है
nmxprime

17

से roseindia :

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");

7
जो कोई भी व्यक्ति ने उत्तर दिया, कृपया टिप्पणी जोड़ें, ताकि मैं (और अन्य) बेहतर उत्तर देना सीख सकूं।
एलिकएल्ज़िन-किलाका

3
मैंने आपको वोट नहीं दिया लेकिन, getFileNameMap कई बुनियादी फ़ाइल प्रकारों के लिए काम नहीं करता है, उदाहरण के लिए 'bmp'। इसके अलावा URLConnection.guessContentTypeFromName एक ही चीज़ लौटाता है
Ovidiu Buligan

5
बहुत अधूरा कार्य। जावा 7, html, पीडीएफ और जेपीईजी एक्सटेंशन सही माइम-प्रकार लौटाते हैं, लेकिन js और css रिटर्न शून्य!
djsumdog

मैंने 'वेबम' के साथ परीक्षण किया और यह शून्य हो गया।
हेनरिक रोचा

16

यदि आप 5-6 जावा के साथ फंस गए हैं तो सर्वॉय ओपन सोर्स उत्पाद से यह उपयोगिता वर्ग ।

आपको केवल इस फ़ंक्शन की आवश्यकता है

public static String getContentType(byte[] data, String name)

यह सामग्री के पहले बाइट्स की जांच करता है और उस सामग्री के आधार पर सामग्री प्रकारों को लौटाता है और फ़ाइल एक्सटेंशन द्वारा नहीं।


सरल, लोकप्रिय और कुछ फ़ाइल प्रकारों के लिए मुझे काम करना
पड़ा

13

मैं बस सोच रहा था कि ज्यादातर लोग जावा में एक फ़ाइल से एक माइम प्रकार कैसे प्राप्त करते हैं?

मैंने अपना SimpleMagic प्रकाशित किया है जावा पैकेज जो फ़ाइलों और बाइट सरणियों से सामग्री-प्रकार (माइम-प्रकार) निर्धारण की अनुमति देता है। इसे यूनिक्स फ़ाइल (1) कमांड मैजिक फ़ाइलों को पढ़ने और चलाने के लिए डिज़ाइन किया गया है जो कि अधिकांश ~ यूनिक्स ओएस कॉन्फ़िगरेशन का एक हिस्सा हैं।

मैंने अपाचे टीका की कोशिश की, लेकिन यह निर्भरता के टन के साथ बहुत बड़ा है , URLConnectionफाइलों के बाइट्स का उपयोग नहीं करता है, औरMimetypesFileTypeMap बस फाइलों के नामों पर भी गौर करता है।

SimpleMagic से आप कुछ ऐसा कर सकते हैं:

// create a magic utility using the internal magic file
ContentInfoUtil util = new ContentInfoUtil();
// if you want to use a different config file(s), you can load them by hand:
// ContentInfoUtil util = new ContentInfoUtil("/etc/magic");
...
ContentInfo info = util.findMatch("/tmp/upload.tmp");
// or
ContentInfo info = util.findMatch(inputStream);
// or
ContentInfo info = util.findMatch(contentByteArray);

// null if no match
if (info != null) {
   String mimeType = info.getMimeType();
}

1
कई छवि फ़ाइलों पर इसका परीक्षण किया। सभी का नाम बदल दिया गया था। आपकी भयानक लाइब्रेरी ने इसे ठीक से संभाला। इसके प्रकाश को भी संभोग करें :)।
saurabheights

1
हां, यह अच्छा काम करता है। और एंड्रॉइड के भीतर इस समाधान का उपयोग करने की आवश्यकता वाले लोगों के लिए, आप केवल बिल्ड.ग्रेड फ़ाइल में निम्नलिखित को शामिल कर सकते हैं: संकलन ('com.j256.simplemagic: simplemagic: 1.10')
jkincali

1
यह एक महान उपाय है! धन्यवाद!
javydreamercsw

5

मेरे 5 सेंट के साथ चिप करने के लिए:

टी एल, डी आर

मैं MimetypesFileTypeMap का उपयोग करता हूं और ऐसा कोई भी माइम जो वहां नहीं है और मुझे विशेष रूप से इसकी आवश्यकता है, माइम.टाइप फ़ाइल में।

और अब, लंबे समय से पढ़ा:

सबसे पहले, MIME प्रकार की सूची बहुत बड़ी है , यहां देखें: https://www.iana.org/assignments/media-types/media-types.xhtml

मैं पहले JDK द्वारा प्रदान की गई मानक सुविधाओं का उपयोग करना पसंद करता हूं, और अगर यह काम नहीं करता है, तो मैं जाऊंगा और कुछ और देखूंगा।

फ़ाइल एक्सटेंशन से फ़ाइल प्रकार निर्धारित करें

1.6 के बाद से, जावा में MimetypesFileTypeMap है, जैसा कि ऊपर दिए गए किसी एक उत्तर में बताया गया है, और यह माइम प्रकार को निर्धारित करने का सबसे सरल तरीका है:

new MimetypesFileTypeMap().getContentType( fileName );

अपने वेनिला कार्यान्वयन में यह बहुत कुछ नहीं करता है (यानी यह .html के लिए काम करता है लेकिन यह .png के लिए नहीं है)। हालाँकि, आपके लिए आवश्यक किसी भी प्रकार की सामग्री को जोड़ना सरल है:

  1. अपनी परियोजना में META-INF फ़ोल्डर में 'mime.types' नाम की फ़ाइल बनाएँ
  2. प्रत्येक माइम प्रकार के लिए एक पंक्ति जोड़ें जो आपको चाहिए और डिफ़ॉल्ट कार्यान्वयन प्रदान नहीं करता है (समय के अनुसार जैसे-जैसे सैकड़ों माइम बढ़ते हैं और सूची बढ़ती है)।

पीएनजी और जेएस फाइलों के लिए उदाहरण प्रविष्टियां होंगी:

image/png png PNG
application/javascript js

Mime.types फ़ाइल प्रारूप के लिए, यहाँ और अधिक विवरण देखें: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html

फ़ाइल सामग्री से फ़ाइल प्रकार निर्धारित करें

1.7 के बाद से, जावा में java.nio.file.spi.FileTypeDetector है , जो एक विशिष्ट प्रकार के कार्यान्वयन के लिए फ़ाइल प्रकार निर्धारित करने के लिए एक मानक एपीआई को परिभाषित करता है ।

फ़ाइल के लिए माइम लाने के लिए, आप बस फ़ाइलों का उपयोग करेंगे और अपने कोड में ऐसा करेंगे:

Files.probeContentType(Paths.get("either file name or full path goes here"));

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

फिर, इस का वैनिला कार्यान्वयन (जेडडीके के साथ आने वाला) वांछित होने के लिए बहुत कुछ छोड़ देता है।

दूर किसी आकाशगंगा में किसी आदर्श दुनिया में, ये सभी पुस्तकालय जो इस फ़ाइल-टू-माइम-प्रकार की समस्या को हल करने की कोशिश करते हैं , बस java.nio.file.spi.FileTypeDetector लागू करेंगे, आप पसंदीदा कार्यान्वयन लाइब्रेरी के जार में छोड़ देंगे अपने वर्गपथ में फ़ाइल करें और यही होगा।

वास्तविक दुनिया में, जहां आपको TL, DR सेक्शन की आवश्यकता होती है, आपको लाइब्रेरी को उसके नाम के आगे अधिकांश सितारों के साथ ढूंढना चाहिए और उसका उपयोग करना चाहिए। इस विशेष मामले के लिए, मुझे एक (अभी तक;) की आवश्यकता नहीं है।


3

मैंने इसे करने के कई तरीके आजमाए, जिसमें @Joshua फॉक्स द्वारा पहले कहा गया। लेकिन कुछ पीडीएफ फाइलों के लिए अक्सर mimetypes की पहचान नहीं करते हैं, और अन्य नकली फाइलों के साथ भरोसेमंद नहीं हो सकते हैं (मैंने RAR फाइल के साथ TIF में बदल दिए गए एक्सटेंशन के साथ प्रयास किया)। मुझे जो समाधान मिला, जैसा कि @Joshua फॉक्स ने सतही तरीके से कहा है , इस तरह से MimeUtil2 का उपयोग करना है :

MimeUtil2 mimeUtil = new MimeUtil2();
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();

5
मुझे MimeUtil2 के साथ बिल्कुल भी सफलता नहीं मिली - लगभग सब कुछ एप्लिकेशन / ऑक्टेट-स्ट्रीम के रूप में वापस आया। मैंने `MimeUtil.registerMimeDetector (" eu.medsea.mimeutil.detector.MagicMimeMimeDetector "के साथ आरंभ करने के बाद बहुत अधिक सफलता के साथ MimeUtil.getMimeTypes () का उपयोग किया; MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.ExtensionMimeDetector"); MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.OpendesktopMimeDetector"); `
ब्रायन पीपा

2
काम के समाधान के लिए धन्यवाद। उपयोगिता वर्ग को त्वरित करने के तरीके के बारे में माइम-उपयोग का प्रलेखन बहुत स्पष्ट नहीं है। अंत में इसे ऊपर और चल रहा है, लेकिन वास्तविक वर्ग के साथ classname स्ट्रिंग को बदल दिया। MimeUtil.registerMimeDetector (ExtensionMimeDetector.class.getName ()); स्ट्रिंग mimeType = MimeUtil.getMostSpecificMimeType (MimeUtil.getMimeTypes (फ़ाइल नाम)) .String ();
रोब जुरलिंक

2

फ़ाइलों को अपलोड करने के लिए दो परत सत्यापन का उपयोग करना बेहतर है।

पहले आप mimeType की जांच कर सकते हैं और इसे सत्यापित कर सकते हैं।

दूसरा आपको अपनी फ़ाइल के पहले 4 बाइट्स को हेक्साडेसिमल में बदलना चाहिए और फिर इसकी तुलना मैजिक नंबरों से करनी चाहिए। फिर फ़ाइल सत्यापन के लिए जाँच करना वास्तव में सुरक्षित तरीका होगा।


2

यह ऐसा करने का सबसे सरल तरीका है:

byte[] byteArray = ...
InputStream is = new BufferedInputStream(new ByteArrayInputStream(byteArray));
String mimeType = URLConnection.guessContentTypeFromStream(is);

बहुत अच्छा समाधान!
शेरजोद

2

यदि आप एक सर्वलेट के साथ काम कर रहे हैं और यदि सर्वलेट संदर्भ आपके लिए उपलब्ध है, तो आप इसका उपयोग कर सकते हैं:

getServletContext().getMimeType( fileName );

1
क्या है getServletContext?
ई-इंफो128 १०


0

यदि आप linux OS पर काम करते हैं, तो कमांड लाइन है file --mimetype:

String mimetype(file){

   //1. run cmd
   Object cmd=Runtime.getRuntime().exec("file --mime-type "+file);

   //2 get output of cmd , then 
    //3. parse mimetype
    if(output){return output.split(":")[1].trim(); }
    return "";
}

फिर

mimetype("/home/nyapp.war") //  'application/zip'

mimetype("/var/www/ggg/au.mp3") //  'audio/mp3'

2
यह काम करेगा, लेकिन आईएमओ एक बुरा अभ्यास है क्योंकि यह आपके कोड को एक विशिष्ट ओएस से जोड़ता है और इसे चलाने वाले सिस्टम में बाहरी उपयोगिता की आवश्यकता होती है। मुझे गलत मत समझो; यह पूरी तरह से वैध समाधान है, लेकिन पोर्टेबिलिटी को तोड़ता है - जो जावा को पहली जगह में उपयोग करने के मुख्य कारणों में से एक है ...
ट्वाइन

@ToVine: रिकॉर्ड के लिए, मैं सम्मान से असहमत हूं। हर जावा प्रोग्राम पोर्टेबल होने के लिए आवश्यक नहीं है। संदर्भ और प्रोग्रामर को यह निर्णय लेने दें। en.wikipedia.org/wiki/Java_Native_Interface
ज़ाहोन

0

विभिन्न अन्य पुस्तकालयों की कोशिश करने के बाद मैं माइम-उपयोग के साथ बस गया।

<groupId>eu.medsea.mimeutil</groupId>
      <artifactId>mime-util</artifactId>
      <version>2.1.3</version>
</dependency>

File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);

0
public String getFileContentType(String fileName) {
    String fileType = "Undetermined";
    final File file = new File(fileName);
    try
    {
        fileType = Files.probeContentType(file.toPath());
    }
    catch (IOException ioException)
    {
        System.out.println(
                "ERROR: Unable to determine file type for " + fileName
                        + " due to exception " + ioException);
    }
    return fileType;
}

यह विधि Files.probeContentType (स्ट्रिंग) JDK संस्करण 1.7 के बाद से उपलब्ध है और यह मेरे लिए बहुत अच्छा काम करता है।
रेजा रहिमी

धन्यवाद, केवल मैं समझ नहीं पा रहा हूं कि कुछ उपयोगकर्ताओं ने वोट क्यों दिया)))
वाजेन टोरोसियन

बिलकुल नहीं, हो सकता है कि उनके पास JDK :) का पुराना संस्करण हो))
रेजा रहिमी

0

आप इसे केवल एक पंक्ति के साथ कर सकते हैं: MimetypesFileTypeMap ()। GetContentType (नई फ़ाइल ("filename.ext")) । पूरा परीक्षण कोड देखें (जावा 7):

import java.io.File;
import javax.activation.MimetypesFileTypeMap;
public class MimeTest {
    public static void main(String a[]){
         System.out.println(new MimetypesFileTypeMap().getContentType(
           new File("/path/filename.txt")));
    }
}

यह कोड निम्नलिखित आउटपुट का उत्पादन करता है: पाठ / सादा


0
File file = new File(PropertiesReader.FILE_PATH);
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file);
URLConnection uconnection = file.toURL().openConnection();
mimeType = uconnection.getContentType();

4
हालांकि यह कोड प्रश्न को हल कर सकता है, स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है।
श्री

0

मैंने इसे निम्नलिखित कोड के साथ किया।

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MimeFileType {

    public static void main(String args[]){

        try{
            URL url = new URL ("https://www.url.com.pdf");

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            InputStream content = (InputStream)connection.getInputStream();
            connection.getHeaderField("Content-Type");

            System.out.println("Content-Type "+ connection.getHeaderField("Content-Type"));

            BufferedReader in = new BufferedReader (new InputStreamReader(content));

        }catch (Exception e){

        }
    }
}

0

अपाचे टीका।

<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.24</version>
</dependency>

और कोड की दो लाइन।

Tika tika=new Tika();
tika.detect(inputStream);

नीचे स्क्रीनशॉट

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.