例如,我想使用以下函数从文件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。
答案 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;
}
清理方法对其他事情也很有用。