Getting A File's Mime Type In Java

后端 未结 23 2774
南方客
南方客 2020-11-21 06:53

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.

Th

23条回答
  •  鱼传尺愫
    2020-11-21 07:32

    I couldn't find anything to check for video/mp4 MIME type so I made my own solution. I happened to observe that Wikipedia was wrong and that the 00 00 00 18 66 74 79 70 69 73 6F 6D file signature is not correct. the fourth byte (18) and all 70 (excluded) after changes quite a lot amongst otherwise valid mp4 files.

    This code is essentially a copy/paste of URLConnection.guessContentTypeFromStream code but tailored to video/mp4.

    BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(content));
    String mimeType = URLConnection.guessContentTypeFromStream(bis);
    
    // Goes full barbaric and processes the bytes manually
    if (mimeType == null){
        // These ints converted in hex ar:
        // 00 00 00 18 66 74 79 70 69 73 6F 6D
        // which are the file signature (magic bytes) for .mp4 files
        // from https://www.wikiwand.com/en/List_of_file_signatures
        // just ctrl+f "mp4"
        int[] mp4_sig = {0, 0, 0, 24, 102, 116, 121, 112};
    
        bis.reset();
        bis.mark(16);
        int[] firstBytes = new int[8];
        for (int i = 0; i < 8; i++) {
            firstBytes[i] = bis.read();
        }
        // This byte doesn't matter for the file signature and changes
        mp4_sig[3] = content[3];
    
        bis.reset();
        if (Arrays.equals(firstBytes, mp4_sig)){
            mimeType = "video/mp4";
        }
    }
    

    Tested successfully against 10 different .mp4 files.

    EDIT: Here is a useful link (if it is still online) where you can find samples of many types. I don't own those videos, don't know who does either, but they're useful for testing the above code.

提交回复
热议问题