জাভাতে একটি ফাইলের মাইম প্রকার পাওয়া


336

আমি কেবল ভাবছিলাম যে বেশিরভাগ লোক জাভাতে কোনও ফাইল থেকে একটি মাইম টাইপ নিয়ে আসে? এখনও পর্যন্ত আমি দুটি ব্যবহারের চেষ্টা করেছি: JMimeMagic&Mime-Util

প্রথমটি আমাকে মেমরির ব্যতিক্রম দিয়েছে, দ্বিতীয়টি এর স্ট্রিমগুলি সঠিকভাবে বন্ধ করে না। আমি কেবল ভাবছিলাম যে অন্য কারও কাছে এমন কোনও পদ্ধতি / গ্রন্থাগার রয়েছে যা তারা সঠিকভাবে ব্যবহার করেছে এবং কাজ করেছে?


4
উপলভ্য গ্রন্থাগারগুলির জন্য একটি ভাল ওভারভিউ rgagnon.com/javadetails/java-0487.html
কোপ্পোর

আমি এখানে উত্তর হিসাবে পোস্ট করা ক্লাসটি ব্যবহার করেছি: stackoverflow.com/a/10140531/293280
জোশুয়া পিন্টার

3
টিকার এখন উত্তর হওয়া উচিত। নীচের অন্যান্য উত্তরগুলি টিকার সাথে অনেকগুলি নির্ভরশীলতার আলো তৈরি করে, তবে আমি টিকা-কোর সহ কিছুই দেখছি না।
javamonkey79

@ জাভামনকি ৯ যখন আমরা টিআইকা ব্যবহার করি তখন এটি ফাইলটিকে আচ্ছাদন করে এবং এটি আর ব্যবহারযোগ্য হয় না। স্ট্রিং কনটেন্ট টাইপ = tika.detect (হয়)।
দুর্দান্ত টেকি

উত্তর:


326

জাভা 7 এ আপনি এখন কেবল ব্যবহার করতে পারেন Files.probeContentType(path)


62
সচেতন থাকুন যে ফাইলগুলি.প্রোব কনটেন্টটাইপ (পাথ) বেশ কয়েকটি ওএসে বগি এবং প্রচুর বাগ রিপোর্ট দায়ের করা হয়েছে। উবুন্টুতে কাজ করা সফ্টওয়্যারটিতে তবে উইন্ডোতে ব্যর্থ হয়ে আমার সমস্যা হয়েছে। দেখে মনে হয়েছিল উইন্ডোজ ফাইলস.প্রোব কনটেন্টটাইপ (পাথ) সর্বদা নালায় ফিরে আসে। এটি আমার সিস্টেম ছিল না তাই আমি জেআরই বা উইন্ডোজ সংস্করণটি পরীক্ষা করে দেখিনি। এটি জাভা 7 এর জন্য ওরাকল জেআরই সহ সম্ভবত উইন্ডোজ 7 বা 8 ছিল
সিলভার

13
আমি OS X এর 10.9 চলমান করছি এবং আমার পেতে nullআউট .xml, .pngএবং .xhtmlফাইল। আমি জানি না যে আমি ভয়াবহভাবে কিছু ভুল করছি কিনা, তবে এটি দেখতে ভয়াবহ বলে মনে হয়।

36
এর সাথে একটি প্রধান সীমাবদ্ধতা হ'ল ফাইল সিস্টেমে ফাইলটি থাকা আবশ্যক। এটি স্ট্রিম বা বাইট অ্যারে ইত্যাদির সাথে কাজ করে না
Necreaux

3
এই পদ্ধতি আর আসতে পারবেন না MIME প্রকার যখন আমি name.For exmaple থেকে এক্সটেনশন মুছে ফেলেন নাম test.mp4 আমি "টেস্ট" সেটিকে পরিবর্তন এবং পদ্ধতি আয় null.Also আমি পরিবর্তন সিনেমা এক্সটেনশন PNG ইত্যাদি এটা MIME প্রকার png ফেরৎ
Sarkhan

10
যদি ফাইলটির অনুপস্থিত বা ভুল এক্সটেনশন থাকে তবে এটি অকেজো।
shmosel

215

দুর্ভাগ্যবশত,

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

কাজ করে না, যেহেতু ইউআরএল এর এই ব্যবহারটি কোনও ফাইলকে লক করে রেখে দেয়, উদাহরণস্বরূপ, এটি অপসারণযোগ্য।

তবে আপনার কাছে এটি রয়েছে:

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

এবং নীচেরগুলিও, যা কেবলমাত্র ফাইল এক্সটেনশনের ব্যবহারের বাইরে যাওয়ার সুবিধা রয়েছে এবং বিষয়বস্তুতে উঁকি দেয়

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

তবে উপরের মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, মাইম-প্রকারের অন্তর্নির্মিত টেবিলটি বেশ সীমাবদ্ধ, উদাহরণস্বরূপ, এমএসওয়ার্ড এবং পিডিএফ সহ নয়। সুতরাং, যদি আপনি সাধারণীকরণ করতে চান তবে আপনাকে বিল্ট-ইন লাইব্রেরিগুলি ছাড়িয়ে যেতে হবে, উদাহরণস্বরূপ, মাইম-ইউটিল (যা একটি দুর্দান্ত পাঠাগার, ফাইল এক্সটেনশন এবং সামগ্রী উভয়ই ব্যবহার করে)।


8
নিখুঁত সমাধান - আমাকে অনেক সাহায্য করেছে! মোড়ানো FileInputStreamমধ্যে BufferedInputStreamঅন্যথায় - গুরুত্বপূর্ণ অংশ guessContentTypeFromStreamআয় null(পাস InputStreamউদাহরণস্বরূপ চিহ্ন সমর্থন করা উচিত)
Yuriy Nakonechnyy

11
হাওয়ারওয়ারের URLConnectionকাছে এমন একটি সীমিত সামগ্রী রয়েছে যা এটি স্বীকৃতি দেয়। উদাহরণস্বরূপ এটি সনাক্ত করতে সক্ষম হয় না application/pdf
কেপেন্টেভ

3
এটি কেবল এটি লক করে দেয় কারণ আপনি নিজেকে এটি বন্ধ করার কোনও উপায় রাখেন নি। URL সংযোগ বিচ্ছিন্ন করা এটিকে আনলক করবে।
লার্নের মারকুইস 2

1
অনুমানের কনটেন্টটাইপফ্রিমস্ট্রিম বা অনুমান উভয়ই কনট্যান্টটাইপফর্মনাম এমপি 4
হার্টমুট পি

3
guessContentTypeFromName()ডিফল্ট $JAVA_HOME/lib/content-types.propertiesফাইল ব্যবহার করে । আপনি সিস্টেমের সম্পত্তি পরিবর্তন করে আপনার নিজস্ব বর্ধিত ফাইল যুক্ত করতে পারেনSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
রসিকা পেরেরা

50

জেএফ এপিআই জেডিকে of এর অংশ at দেখুন javax.activation package প্যাকেজটি দেখুন।

সর্বাধিক আকর্ষণীয় ক্লাসগুলি javax.activation.MimeTypeহ'ল - প্রকৃত মাইম টাইপধারক - এবং javax.activation.MimetypesFileTypeMap- শ্রেণি যার উদাহরণটি মাইমে টাইপটিকে কোনও ফাইলের স্ট্রিং হিসাবে সমাধান করতে পারে:

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)রাষ্ট্রগুলির জাভাদোক হিসাবে : ফাইল অবজেক্টের মাইম টাইম ফিরিয়ে দেয় this এই শ্রেণীর প্রয়োগটি কল করে getContentType(f.getName())
ম্যাটিস

3
আর স্মরণ কর, তাই এটি নিখুঁত আপনি মেটা-INF / mime.types ফাইলের সাথে এই কার্যকারিতা প্রসারিত করতে পারেন আপনি জাভা 6. ব্যবহার করতে বাধ্য করা হয়, তাহলে docs.oracle.com/javaee/5/api/javax/activation/...
Chexpir

8
আপনি একটি নতুন অবজেক্ট তৈরি এড়িয়ে যেতে পারেনMimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
akostadinov

আপনার উত্তরের জন্য ধন্যবাদ. এটি আমার জন্য সফলভাবে কাজ করছে।
রাাদাদিয়া নিকুঞ্জ

তবে এটি কেবল ফাইলের উপর ভিত্তি করে সামগ্রীর ধরণটি ফেরত দেয়। এবং এটি ব্যবহারকারীদের দ্বারা আপলোড করা ফাইলগুলির জন্য বিশেষত বিপজ্জনক।
সের্গেই পোনোমারেভ

47

সঙ্গে এ্যাপাচি 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)

মনে রাখবেন যে এর এপিআইগুলি সমৃদ্ধ, এটি "যে কোনও কিছু" কে পার্স করতে পারে। টিকা-কোর 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)

আরও তথ্যের জন্য এপিডোকস দেখুন ।


1
এটি সিএসভির জন্য কাজ করে না। Wtf? stackoverflow.com/questions/46960231/...
gstackoverflow

1
টিকা সম্পর্কে একটি খারাপ বিষয়, প্রচুর নির্ভরতা ফুলে। এটি আমার জারের আকার 54MB দ্বারা বৃদ্ধি করেছে !!!
হেলমি

1
@helmyTika 1.17 একক এবং একমাত্র 648 কেবি বড়।
সায়ানান

... বা কেবল new Tika().detect(file.toPath())ফাইলের সামগ্রীর উপর ভিত্তি করে সনাক্তকরণের চেয়ে ফাইলের এক্সটেনশান ভিত্তিক সনাক্তকরণের জন্য
Lu55

@ Lu55 ডক্স বলছে যে এখনও নথির সামগ্রী ব্যবহার করে। আমার মনে হয় আপনি বোঝাতে চেয়েছেন new Tika().detect(file.getPath()), যা কেবল ফাইল এক্সটেনশন ব্যবহার করে
delucasvb

31

এ্যাপাচি Tika মধ্যে অফার টিকা কোর একটি MIME প্রকার সনাক্তকরণ প্রবাহ উপসর্গ জাদু মার্কার উপর ভিত্তি করে ভিত্তি করে। tika-coreঅন্যান্য নির্ভরতা আনতে পারে না, যা এটি বর্তমানে অপ্রত্যাশিত মাইম প্রকার সনাক্তকরণ ইউটিলিটির মতো হালকা ওজনের করে তোলে ।

ভেরিয়েবল theInputStreamএবং ব্যবহার করে সাধারণ কোড উদাহরণ (জাভা 7)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();
}

দয়া করে নোট করুন যে মিডিয়াটাইপ.ডিটেক্ট (...) সরাসরি ব্যবহার করা যাবে না ( TIKA-1120 )। আরও ইঙ্গিতগুলি https://tika.apache.org/0.10/detection.html এ সরবরাহ করা হয়েছে ।


1
+1 এছাড়াও Metadata.RESOURCE_NAME_KEYবাদ দেওয়া যেতে পারে (যদি আপনার কোনও না থাকে বা মূল নামের উপর নির্ভর করতে না পারেন) তবে সেই ক্ষেত্রে আপনি কিছু ক্ষেত্রে ভুল ফলাফল পাবেন (উদাহরণস্বরূপ অফিসের নথি)।
ব্যবহারকারী 1516873

ফাইলের নামের কোনও এক্সটেনশন না থাকলে এক্সএলএসএক্স সনাক্ত করতে এটির কিছু সমস্যা আছে ... তবে এই সমাধানটি সহজ এবং মার্জিত।
অস্কার পেরেজ

23

আপনি যদি অ্যান্ড্রয়েড বিকাশকারী হন তবে আপনি এমন একটি ইউটিলিটি ক্লাস ব্যবহার করতে পারেন android.webkit.MimeTypeMapযা এক্সটেনশানগুলি ফাইল করার জন্য মাইমাম-প্রকারের মানচিত্র তৈরি করে এবং বিপরীতে।

নিম্নলিখিত কোড স্নিপেট আপনাকে সাহায্য করতে পারে।

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

3
"/Sdcard/path/to/video.extension" এর মতো স্থানীয় ফাইল পাথ দিয়ে চেষ্টা করা থাকলে এটিও কাজ করে। সমস্যাটি হ'ল যদি স্থানীয় ফাইলটিতে তার পথে জায়গা থাকে তবে এটি সর্বদা নাল
nmxprime

17

গোলাপিন্ডিয়া থেকে :

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

7
যে কেউ উত্তরটি ভোট দিয়েছে, দয়া করে একটি মন্তব্য যুক্ত করুন যাতে আমি (এবং অন্যরা) আরও ভাল উত্তর পোস্ট করতে শিখতে পারি।
অ্যালিকেলজিন-কিলাকা

3
আমি আপনাকে ভোট দিলাম না তবে getFileNameMap অনেকগুলি বেসিক ফাইলের জন্য কাজ করে না, উদাহরণস্বরূপ 'bmp'। এছাড়াও ইউআরএল সংযোগ.গুয়েস কনটেন্ট টাইপফর্মনাম একই জিনিসটি ফেরত দেয়
ওভিদিউ বুলিগান

5
খুব অসম্পূর্ণ কাজ। জাভা 7 হিসাবে, এইচটিএমএল, পিডিএফ এবং জেপিগ এক্সটেনশানগুলি সঠিক মাইম-টাইপ দেয় তবে জেএস এবং সিএসএস রিটার্ন নাল!
ডিজেসডডোগ

আমি 'ওয়েবম' দিয়ে পরীক্ষা করেছি এবং এটি বাতিল হয়ে গেছে returned
হেনরিক রোচা

16

যদি আপনি জাভা 5-6 এর সাথে আটকে থাকেন তবে সার্ভয় ওপেন সোর্স পণ্য থেকে এই ইউটিলিটি ক্লাস

আপনার কেবল এই ফাংশনটি দরকার

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

এটি সামগ্রীর প্রথম বাইট অনুসন্ধান করে এবং ফাইলের এক্সটেনশান দ্বারা নয় বরং সেই সামগ্রীটির উপর ভিত্তি করে সামগ্রী প্রকারগুলি প্রদান করে।


আমার প্রয়োজন সরল, জনপ্রিয় এবং কয়েকটি ফাইল ধরণের জন্য কাজ করেছি :)
ব্যবহারকারীর 489041

13

আমি কেবল ভাবছিলাম যে বেশিরভাগ লোক জাভাতে কোনও ফাইল থেকে একটি মাইম টাইপ নিয়ে আসে?

আমি আমার সিম্পেলজ্যাগিক প্রকাশ করেছি জাভা প্যাকেজটি যা ফাইল এবং বাইট অ্যারে থেকে সামগ্রী-প্রকারের (মাইম-টাইপ) নির্ধারণের অনুমতি দেয়। এটি ইউনিক্স ফাইল (1) কমান্ড ম্যাজিক ফাইলগুলি পড়তে এবং চালানোর জন্য ডিজাইন করা হয়েছে যা বেশিরভাগ ~ ইউনিক্স ওএস কনফিগারেশনের একটি অংশ।

আমি অ্যাপাচি টিকার চেষ্টা করেছিলাম তবে এটি প্রচুর নির্ভরশীলতার সাথে বিশাল , URLConnectionফাইলগুলির বাইট ব্যবহার করে না এবংMimetypesFileTypeMap এবং কেবল ফাইলের নামও দেখে।

সিম্পল ম্যাজিক দিয়ে আপনি এর মতো কিছু করতে পারেন:

// 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
একাধিক চিত্র ফাইলগুলিতে এটি পরীক্ষা করা হয়েছে। সবার এক্সটেনশনের নামকরণ করা হয়েছিল। আপনার দুর্দান্ত লাইব্রেরি এটি সঠিকভাবে পরিচালনা করেছে। অবশ্যই এর আলো :)।
সৌরভাইট

1
হ্যাঁ, এটি ভাল কাজ করে। এবং অ্যান্ড্রয়েডের মধ্যে এই সমাধানটি ব্যবহার করার জন্য যাদের প্রয়োজন, আপনি কেবল বিল্ড.gradle ফাইলের মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত করতে পারেন: সংকলন করুন ('com.j256.simplemagic: সরলসাধ্য: 1.10')
jkincali

1
এটি একটি দুর্দান্ত সমাধান! ধন্যবাদ!
javydreamercsw

5

আমার 5 সেন্ট দিয়ে চিপ করতে:

টি এল, ডিআর

আমি মিমিটাইপসফাইলেটটাইপম্যাপ ব্যবহার করি এবং যে মাইম নেই সেগুলি যুক্ত করে এবং বিশেষত এটির প্রয়োজন হয় মাইম. টাইপস ফাইলে।

এবং এখন, দীর্ঘ পড়া:

প্রথমত, মাইম টাইমগুলির তালিকা বিশাল , এখানে দেখুন: https://www.iana.org/assignments/media-tyype/media-tyype.xhtml

আমি প্রথমে জেডিকে সরবরাহিত স্ট্যান্ডার্ড সুবিধাগুলি ব্যবহার করতে চাই এবং যদি এটি কাজ করে না, আমি গিয়ে অন্য কিছু সন্ধান করব।

ফাইল এক্সটেনশন থেকে ফাইলের ধরণ নির্ধারণ করুন

১.6 থেকে, জাভাতে মাইমাইটাইপস ফাইলটাইপম্যাপ রয়েছে, উপরের উত্তরের একটিতে উল্লিখিত হয়েছে, এবং এটি মাইমের ধরণ নির্ধারণ করার সবচেয়ে সহজ উপায়:

new MimetypesFileTypeMap().getContentType( fileName );

এর ভ্যানিলা বাস্তবায়নে এটি বেশি কিছু করে না (অর্থাত্ এটি .html এর জন্য কাজ করে তবে এটি .png ব্যবহার করে না)। তবে এটি আপনার প্রয়োজন হতে পারে এমন যে কোনও সামগ্রীর ধরণের যোগ করা অত্যন্ত সহজ:

  1. আপনার প্রকল্পের মেটা-আইএনএফ ফোল্ডারে 'মাইম.টাইপস' নামে ফাইল তৈরি করুন
  2. আপনার প্রয়োজন প্রতিটি মাইম টাইপের জন্য একটি লাইন যুক্ত করুন এবং ডিফল্ট বাস্তবায়ন সরবরাহ করে না (কয়েকশ মাইম প্রকার রয়েছে এবং সময়ের সাথে তালিকাগুলি বৃদ্ধি পাবে)।

পিএনজি এবং জেএস ফাইলগুলির জন্য উদাহরণগুলির উদাহরণগুলি হ'ল:

image/png png PNG
application/javascript js

মাইম.টাইপস ফাইল ফর্ম্যাটের জন্য আরও বিশদ এখানে দেখুন: 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"));

এপিআই সংজ্ঞা এমন সুবিধাগুলি সরবরাহ করে যা ফাইলের নাম থেকে ফাইলের মাইম টাইপ নির্ধারণের জন্য বা ফাইল সামগ্রী (যাদু বাইটস) সমর্থন করে। এজন্য প্রোব কনটেন্টটাইপ () পদ্ধতিটি আইওএক্সেপশন নিক্ষেপ করে, যদি এই API এর বাস্তবায়নের সাথে সম্পর্কিত ফাইলটিকে এর সাথে যুক্ত ফাইলটি খোলার চেষ্টা করে তবে এটি ব্যবহার করে।

আবার, এর ভ্যানিলা বাস্তবায়ন (জেডিকে সঙ্গে আসে এমন একটি) অনেকগুলি পছন্দসই হতে পারে।

কোনও ছায়াপথের অনেক দূরে, খুব দূরে, এই সমস্ত লাইব্রেরি যা এই ফাইল-টু-মাইম-টাইপ সমস্যার সমাধান করার চেষ্টা করে কেবল java.nio.file.spi.FileTypeDector প্রয়োগ করবে, আপনি পছন্দসই বাস্তবায়নকারী লাইব্রেরির জারে ফেলে যাবেন আপনার ক্লাসপথে ফাইল করুন এবং এটি হবে।

রিয়েল ওয়ার্ল্ডে, যেখানে আপনার টিএল, ডিআর সেকশন প্রয়োজন, আপনার নামের পাশে বেশিরভাগ তারকাগুলি সহ গ্রন্থাগারটি খুঁজে পাওয়া উচিত এবং এটি ব্যবহার করা উচিত। এই বিশেষ ক্ষেত্রে, আমার একটি প্রয়োজন নেই (এখনও;))।


3

আমি এটি করার বিভিন্ন উপায় চেষ্টা করেছি, যার মধ্যে প্রথমটি ছিল জোশুয়া ফক্স said তবে কিছু পিডিএফ ফাইলের মতো ঘন ঘন মাইমটাইপগুলি স্বীকৃতি দেয় না এবং অন্যগুলি নকল ফাইলগুলির সাথে বিশ্বাসযোগ্য হতে পারে না (টিআইএফ-র পরিবর্তিত একটি আরআর ফাইল দিয়ে চেষ্টা করেছি)। আমি যে সমাধানটি পেয়েছি, যেমনটি @ জোশুয়া ফক্স একটি অতিমাত্রায় উপায়ে বলেছে , এটি মাইম ইউটি 2 ব্যবহার করে :

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

5
মাইম ইউটিল 2 এর সাথে আমার মোটেও সাফল্য ছিল না - প্রায় সবকিছুই অ্যাপ্লিকেশন / অক্টেট-স্ট্রিম হিসাবে ফিরে আসে। আমি `MimeUtil.registerMimeDetector (" eu.medsea.mimeutil.detector.MagicMimeMimeDetector ") এর সাথে আরম্ভ করার পরে আরও সাফল্যের সাথে মাইম ইউটি.জেটমাইমটাইপস () ব্যবহার করেছি; MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.ExtensionMimeDetector"); MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.OpendesktopMimeDetector"); `
ব্রায়ান পিপা

2
কাজের সমাধানের জন্য ধন্যবাদ। মাইম-ইউজের ডকুমেন্টেশন কীভাবে ইউটিলিটি ক্লাসটি ইনস্ট্যান্ট করবেন সে সম্পর্কে খুব স্পষ্ট নয়। অবশেষে এটি প্রস্তুত এবং চলমান হয়েছে, কিন্তু প্রকৃত শ্রেণীর সাথে শ্রেণিকামের স্ট্রিং প্রতিস্থাপন করেছে। MimeUtil.registerMimeDetector (ExtensionMimeDetector.class.getName ()); স্ট্রিং মাইমটাইপ = মাইম ইউটিল.সেটমস্টস্পিফিকমাইম টাইপ (মাইম ইউটি.সেটমাইটটাইমস (ফাইলের নাম))। টু স্ট্রিং ();
রব জুরলিংক

2

ফাইল আপলোডের জন্য দুটি স্তর বৈধতা ব্যবহার করা ভাল।

প্রথমে আপনি মাইমটাইপ পরীক্ষা করে এটি যাচাই করতে পারবেন।

দ্বিতীয়টি আপনার ফাইলের প্রথম 4 বাইটকে হেক্সাডেসিমালে রূপান্তর করতে হবে এবং তারপরে যাদু সংখ্যার সাথে এটি তুলনা করতে হবে। তারপরে এটি ফাইলের বৈধতা যাচাই করার জন্য একটি নিরাপদ উপায় হবে।


2

এটি করার জন্য এটি পাওয়া সবচেয়ে সহজ উপায়:

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

খুব ভাল সমাধান!
শেরজোদ

2

আপনি যদি কোনও সার্লেটের সাথে কাজ করছেন এবং সার্লেলেট প্রসঙ্গটি যদি আপনার কাছে উপলব্ধ থাকে তবে আপনি ব্যবহার করতে পারেন:

getServletContext().getMimeType( fileName );

1
কী getServletContext?
ই তথ্য 128


0

আপনি যদি লিনাক্স ওএসে কাজ করেন তবে একটি কমান্ড লাইন রয়েছে 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
এটি কাজ করবে, তবে আইএমও এটি একটি খারাপ অভ্যাস, কারণ এটি আপনার কোডটি একটি নির্দিষ্ট ওএসের সাথে যুক্ত করে এবং এটি চালিত সিস্টেমে বাহ্যিক ইউটিলিটি উপস্থিত থাকা প্রয়োজন। আমাকে ভুল করবেন না; এটি পুরোপুরি বৈধ সমাধান, তবে বহনযোগ্যতা ভঙ্গ করে - যা জাভা প্রথম স্থানে ব্যবহারের অন্যতম প্রধান কারণ ...
টোভাইন

@ টোভাইন: রেকর্ডের জন্য, আমি শ্রদ্ধার সাথে একমত হচ্ছি না। প্রতিটি জাভা প্রোগ্রাম বহনযোগ্য হতে হবে না। প্রসঙ্গ এবং প্রোগ্রামারকে সেই সিদ্ধান্ত নিতে দিন। en.wikipedia.org/wiki/Java_Native_Interface
Zahnon

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;
}

এই পদ্ধতিটি ফাইল.প্রোব কনটেন্টটাইপ (স্ট্রিং) জেডিকে সংস্করণ ১.7 থেকে পাওয়া যায় এবং এটি আমার পক্ষে খুব ভাল কাজ করে।
রেজা রহিমি

ধন্যবাদ, কেবলমাত্র কিছু ব্যবহারকারী কেন ভোট
কমিয়েছিলেন

মোটেও নয়, তাদের জেডিকে আগের সংস্করণ থাকতে পারে :)))
রেজা রহিমি

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);

স্ক্রিনশট নীচে

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.