web-dev-qa-db-ja.com

JavaのMIMEタイプから適切なファイル拡張子を決定する方法

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

Apache Tikaライブラリへの参照をいくつか見ましたが、それはやりすぎのようで、ファイル拡張子を正常に検出することができませんでした。私が収集したことから、このコードは機能するはずですが、型変数が「image/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
    }
29
rphutchinson

一部のコメンターが指摘したように、MIMEタイプとファイル拡張子との間に普遍的な1:1マッピングはありません...

可能な限り、MIMEタイプを保存し、それを今後使用し、拡張機能を忘れることをお勧めします。

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

JPEGファイルの最も一般的な拡張子を取得する場合は、 このApache Tikaの単体テスト に示すように、次のような操作を行うだけです。

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

重要なことは、すべてのmimetypeの定義を取得するには、Tika jarにバンドルされているxmlファイルをロードする必要があるということです。カスタムmimetypeも処理する場合、Tikaはそれらをサポートし、1行目を次のように変更します。

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

TikaConfigメソッドを使用してMimeTypesを取得することにより、Tikaはカスタムmimetype定義のクラスパスもチェックし、それらも含めます。

48
Gagravarr