JavaでファイルのヘッダーからContentTypeを取得する方法

アップロードしたファイルの種類を取得する方法として、以下の3つほどあげられるかと思います。

  • ファイルの拡張子から取得
  • ファイルのContentTypeから取得(ブラウザによって付与される情報)
  • ファイル本体のヘッダーから取得

今回は3つ目のファイル本体のヘッダーから取得する方法

URLConnection.guessContentTypeFromStreamを使う方法

    InputStream is = new BufferedInputStream(new FileInputStream(file));
    return URLConnection.guessContentTypeFromStream(is);

mime-utilを使う方法

    MimeUtil
      .registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
    Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);

    if (!mimeTypes.isEmpty()) {
      Iterator<?> iterator = mimeTypes.iterator();
      MimeType mimeType = (MimeType) iterator.next();
      return mimeType.getMediaType() + "/" + mimeType.getSubType();
    }
    return "application/octet-stream";

それぞれの判定の精度

URLConnection.guessContentTypeFromStream

  • pdf:null
  • ppt:null
  • xls:null
  • jpg:image/jpeg
  • png:image/png
  • gif:image/gif
  • txt:null
  • mov:null
  • mp4:null
  • mpg:null

mime-util

  • pdf:application/pdf
  • ppt:application/msword
  • xls:application/msword
  • jpg:image/jpeg
  • png:image/png
  • gif:image/gif
  • txt:application/octet-stream
  • mov:video/quicktime
  • mp4:video/mp4
  • mpg:video/mp2p

どうやらmime-utilの方が精度が良いようです。