37

ファイルを 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
    }
4

1 に答える 1

71

一部のコメンターが指摘しているように、MIME タイプとファイル拡張子の間に普遍的な 1:1 マッピングはありません... 一部の MIME タイプには複数の可能な拡張子があり、多くの拡張子は複数の MIME タイプで共有され、一部の MIME タイプには拡張子がありません。

可能な限り、MIME タイプを保存してそれを使用し、拡張子を忘れる方がはるかに優れています。

とはいえ、特定の MIME タイプの最も一般的なファイル拡張子を取得したい場合は、Tika が適しています。Apache Tikaには、認識している MIME タイプの非常に大きなセットがあり、これらの多くについて、検出用の MIME マジック、一般的な拡張子、説明なども認識しています。

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

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

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

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

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

于 2012-11-30T23:45:31.080 に答える