2013-01-14 25 views
7

は例えば、私は、以下の機能を使用してファイルのURLからファイルの拡張子を取得したい:Android:MimeTypeMap.getFileExtensionFromUrl()を使用する必要がありますか? [バグ]

ファイル名:ファイルの

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

URL:

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

関数呼び出し:

String extension = MimeTypeMap.getFileExtensionFromUrl(url); 

しかし、私はfunctio nコール。これはバグか機能ですか?

多くの外来文字(paranthesisなど)が含まれていないファイル名では問題ありません。

機能はバグですか?何か不足していますか?バグを機能と区別するにはどうしたらいいですか?私は関数の説明を読んだので正しく動作するはずです。

あなたのプロジェクトで個人的に使用していますか?それはreliableのようではありません。

答えて

18

私はあなたのコードをテストするときに例外がスローされます。適切なファイル拡張子 "jpg"は返されません。私はMimeTypeMapを使用して助言しません。 MimeTypeMap.getFileExtensionFromUrl(url)が失敗した理由を

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

次のように代わりに、ファイルの拡張子を取得する簡単な方法はありますか?それはあなたのものではない正しい形式の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は無効な文字とみなします。この部分、IMHOはバグです。

私の経験から、ほとんどの人はこの方法を使用しません。実際、あなたがこの質問を投稿するまで、聞いたことはありませんでした。おそらく、ファイルの拡張子を見つけるのは簡単ではないので、ほとんどの人は上記のようなコードを書くでしょう。

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

サニタイズ方法は、他のもののために有用です。

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); 
} 
関連する問題