11

例如,我想使用以下函数从文件 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);

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

它适用于不包含那么多外来字符(例如括号)的文件名。

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

你个人在你的项目中使用它吗?这似乎不可靠

4

3 回答 3

28

当我测试您的代码时,不会为我抛出异常。虽然没有返回正确的文件扩展名“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认为这是一个无效字符。这部分,恕我直言,是一个错误。

根据我的经验,大多数人不使用这种方法。实际上,在您发布此问题之前,我从未听说过。可能是因为查找文件扩展名相当简单,而且大多数人编写的代码类似于我上面发布的代码。

于 2013-01-14T15:32:46.940 回答
3
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); 
} 
于 2016-03-29T06:19:44.233 回答
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;
}

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

于 2014-09-30T08:21:34.523 回答