2013-01-14 107 views
7

例如,我想用下面的函數來得到文件的URL文件擴展名:Android:我應該使用MimeTypeMap.getFileExtensionFromUrl()嗎? [錯誤]

文件名:

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

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

文件的網址函數調用:

String extension = MimeTypeMap.getFileExtensionFromUrl(url); 

但我收到函數異常打電話。這是一個錯誤還是一個功能?

它適用於不包含那麼多外來字符(例如paranthesis)的文件名。

功能越野車嗎?我錯過了什麼嗎?我該如何區分功能中的錯誤?我已閱讀函數說明,它應該正常工作。

你個人是否在你的項目中使用它?它似乎並不是reliable

回答

18

當我測試你的代碼時,我沒有任何異常。雖然沒有返回適當的文件擴展名「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認爲該字符無效。這部分,恕我直言,是一個錯誤。

根據我的經驗,大多數人不使用這種方法。事實上,在你發佈這個問題之前,我從來沒有聽說過它。可能是因爲找到一個文件擴展名是相當微不足道的,大多數人寫代碼類似於我上面發佈的代碼。

0

我在項目中使用這個和它的作品,除非在文件名中有某些字符,

我決定不去分割字符串自己的路線。

我做了一個變通的問題:

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是其他的東西有用。

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