Monday, February 7, 2011

Getting A File's Mime Type In Java

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?

  • Getting A File’s Mime Type In Java

    Bobby Jack : 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.
    Galwegian : 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..?
    ivan_ivanovich_ivanoff : 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**
    From Galwegian
  • 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.

    Kip : 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.
  • 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).

    From Joshua Fox
  • 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);
    
    From Mamuf

0 comments:

Post a Comment