2012-11-30 38 views
26

Amazon S3バケットにファイルをアップロードしていて、元のファイル名ではなくファイルのMIMEタイプを含むInputStreamとStringにアクセスできます。ファイルをS3にプッシュする前に、実際にファイル名と拡張子を作成するのは私の責任です。 MIMEタイプから使用する適切な拡張を決定するためのライブラリや便利な方法はありますか?JavaのMIMEタイプから適切なファイル拡張子を決定する方法

私はApache Tikaライブラリへの参照をいくつか見てきましたが、それは過剰なもののようですが、まだファイル拡張子を正しく検出することができませんでした。私は、このコードは動作するはずのようにそれはそう集めることができましたが、コメント主のいくつかが指摘してきたように私のタイプの変数は、「画像/ JPEG」

MimeType mimeType = null; 
    try { 
     mimeType = new MimeTypes().forName(type); 
    } catch (MimeTypeException e) { 
     Logger.error("Couldn't Detect Mime Type for type: " + type, e); 
    } 

    if (mimeType != null) { 
     String extension = mimeType.getExtension(); 
     //do something with the extension 
    } 
+1

ファイル拡張子を設定する必要がありますか?あなたがMIMEタイプを知っていれば、それを適切な 'Content-Type'でS3にアップロードすることができ、拡張子(通常)は無関係になります。 – willglynn

+2

あなたは正しいです、私はちょうどチェックし、S3のObjectMetadataのContent-Typeを設定することは、私の場合はそのトリックです。私はまだ質問への答えを知りたいと思う、それが将来便利になるかもしれないようだ。 – rphutchinson

+1

十分な公正。ファイル拡張子にはMIMEタイプのTrue Mapping™はありません - 複数の拡張子を持つタイプもあれば、複数のタイプを持つ拡張子もあります - 私が独立して保持できるデータストアを使用している場合、私は知っているものだけを保存しようとします推測を控える。 – willglynn

答えて

41

あるとき、私はちょうど空の文字列を取得しています何からMIMEタイプとファイル拡張子の間には、普遍的な1:1マッピングはありません。いくつかのMIMEタイプには複数の拡張があり、多くの拡張は複数のMIMEタイプで共有され、一部のMIMEタイプには拡張子がありません。

可能であれば、mimetypeを保存し、それを使用して拡張機能を忘れる方がずっと優れています。

しかし、特定のmimetypeに対して最も一般的なファイル拡張子を取得したい場合、Tikaは良い方法です。 Apache Tikaには非常に大きなMIMEタイプのセットがあります。これらの多くは、検出、一般的な拡張子、説明などのMIMEマジックも知っています。

JPEGファイルの最も一般的な拡張子を取得する場合は、 this Apache Tika unit testに示すように、あなただけのような何かをする必要があります。

MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); 
    MimeType jpeg = allTypes.forName("image/jpeg"); 
    String jpegExt = jpeg.getExtension(); // .jpg 
    assertEquals(".jpg", jpeg.getExtension()); 

重要なことは、あなたがすべてのMIMEタイプの定義を取得するためティカジャーに同梱のXMLファイルをロードする必要があるということです。あなたもカスタムMIMEタイプを扱うかもしれない場合は、ティカは1つがあることを、これらの、および変更ラインをサポートしています。

TikaConfig config = TikaConfig.getDefaultConfig(); 
    MimeTypes allTypes = config.getMimeRepository(); 

MIMEタイプを取得するためにTikaConfigメソッドを使用することにより、ティカは、カスタムMIMEタイプのdefintionsのためのクラスパスをチェックします、それらも含まれています。

関連する問題