tags:

views:

6662

answers:

4

I was just wondering how most people fetch a mime type from a file in Java? So far I've tried two utils: JMimeMagic & Mime-Util. The first gave me memory exceptions, the second doesn't close its streams off properly. I was just wondering if anyone else had a method/library that they used and worked correctly?

+2  A: 

Getting A File’s Mime Type In Java

Galwegian
If the point of stackoverflow is to become the home for canonical answers to technical questions, linking offsite will not cut it. That's not to say I agree with this aim.
Bobby Jack
Agreed, but if you google this phrase, there are no shortage of results. I feel it'd be a much shorter (and maybe a more sensible) exercise than to ask a question here... but then again maybe I'm missing a point somewhere along the line..?
Galwegian
The article is wrong about one thing: "Using java.net.URL : Like the above method a match is done with the extension." This is only true, if your file DOES have a known extension. If not, the CONTENT of the file is used to determine its MIME. **BIG DIFFERENCE**
ivan_ivanovich_ivanoff
A: 

Thanks - I saw that article. It's where I got the links from both of the library's that I have tried. Trouble is both of them have got problems and the other methods mentioned are either too slow, too restrictive or overkill. I was hoping someone else might have found something newer.

Lee Theobald
FYI- stack overflow is not a message board, this kind of statement belongs in a comment on an answer, not as an answer in and of itself.
Kip
+8  A: 

Unfortunately,

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

does not work, since this use of URL leaves a file locked, so that, for example, it is undeletable.

However, you have this:

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

and also the following, which has the advantage of going beyond mere use of file extension, and takes a peek at content

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

However, as suggested by the comment above, the built-in table of mime-types is quite limited, not including, for example, MSWord and PDF. So, if you want to generalize, you'll need to go beyond the built-in libraries, using, e.g., Mime-Util (which is a great library, using both file extension and content).

Joshua Fox
+2  A: 

The JAF API is part of JDK 6. Look at javax.activation package.

Most interesting classes are javax.activation.MimeType - an actual MIME type holder - and javax.activation.MimetypesFileTypeMap - class whose instance can resolve MIME type as String for a file:

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