Android:我应该使用MimeTypeMap.getFileExtensionFromUrl()吗? [错误]

时间:2013-01-14 14:40:54

标签: android

例如,我想使用以下函数从文件URL获取文件扩展名:

文件名:

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

文件的网址:

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

函数调用:

String extension = MimeTypeMap.getFileExtensionFromUrl(url);

但是我在函数调用上遇到异常。这是一个错误还是一个功能?

它适用于不包含许多外来字符的文件名(例如paranthesis)。

功能是否有问题?我错过了什么吗?我该如何区分错误和功能?我已经阅读了功能描述,它应该可以正常工作。

您个人在项目中使用它吗?它似乎不是reliable

3 个答案:

答案 0 :(得分:24)

当我测试你的代码时,我没有抛出任何异常。虽然没有返回正确的文件扩展名“jpg”。我不建议使用MimeTypeMap。获取文件扩展名的简便方法如下:

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

至于MimeTypeMap.getFileExtensionFromUrl(url)失败的原因?它期望一个正确格式化的URL字符串,而不是你的。您应该首先使用URLEncoder对其进行编码。例如:

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

应该允许MimeTypeMap.getFileExtensionFromUrl(url)正常工作,但不幸的是,它仍然没有。为什么? URLEncoder会将所有空格更改为“+”符号,getFileExtensionFromUrl会认为该字符无效。这部分,恕我直言,是一个错误。

根据我的经验,大多数人不使用这种方法。事实上,在你发布这个问题之前,我从来没有听说过。可能是因为找到文件扩展名相当简单,大多数人都会编写类似于我上面发布的代码。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我在我的项目中使用它,除非文件名中有某些字符,否则它可以正常工作

我决定不去自己分割弦乐的路线。

我为这个问题做了一个工作:

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

我用这个方法来清理文件名:

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

清理方法对其他事情也很有用。