Android: should I use MimeTypeMap.getFileExtensionFromUrl()? [bugs]

前端 未结 3 1009
情歌与酒
情歌与酒 2021-02-20 06:48

For example, I wanted to get the file Extension from the file URL using the function below:

File name:

Greatest Hits - Lenny Kravitz (Booklet 01) [2000]         


        
相关标签:
3条回答
  • 2021-02-20 07:20

    When I test your code, no exception is thrown for me. Though the proper file extension "jpg" is not returned. I would not advise using MimeTypeMap. An easy way to obtain the file extension instead is as follows:

    String file = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg";
    String exten = "";
    
    int i = file.lastIndexOf('.');
    if (i > 0) {
        exten = file.substring(i+1);
    }
    

    As to why MimeTypeMap.getFileExtensionFromUrl(url) fails? It's expecting a properly formated URL String, which yours is not. You should first encode it using URLEncoder. For example:

    String url = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg";
    url = URLEncoder.encode(url, "UTF-8");
    

    This should allow MimeTypeMap.getFileExtensionFromUrl(url) to work properly but unfortunately it still doesn't. Why? URLEncoder will change all spaces to a '+' sign and getFileExtensionFromUrl considers that an invalid character. This part, IMHO, is a bug.

    From my experience, most people don't use this method. In fact, I never heard of it until you posted this question. Probably because finding a file extension is fairly trivial and most people write code similar to what I posted above.

    0 讨论(0)
  • private String getMimeTypeFromPath(String path) { 
        String extension = path; 
        int lastDot = extension.lastIndexOf('.'); 
        if (lastDot != -1) { 
            extension = extension.substring(lastDot + 1); 
        } 
        // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). 
        extension = extension.toLowerCase(Locale.getDefault()); 
        if (extension.equals("3ga")) { 
            return "audio/3gpp"; 
        } else if (extension.equals("js")) { 
            // Missing from the map :(. 
            return "text/javascript"; 
        } 
        return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    } 
    
    0 讨论(0)
  • 2021-02-20 07:36

    I use this in my project and it works unless there certain characters in the file name,

    I decided to not go the route of splitting the string myself.

    I made a work around for the issue:

    String ext = MimeTypeMap.getFileExtensionFromUrl(sanitizeFileName(Uri.encode(name)));
    

    And i made this method to sanitize file names:

    public static String sanitizeFileName(String name)
    {
        byte[] invalidChars = new byte[]{34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
        for(byte i : invalidChars)
        {
            name = name.replace((char)i,'_');
        }
        return name;
    }
    

    The sanitize method is useful for other things as well.

    0 讨论(0)
提交回复
热议问题