2012年3月9日

用 Java 程式自動偵測 Content Type / Mime Type



使用 FileNameMap

FileNameMap fileNameMap = URLConnection.getFileNameMap();
fileNameMap.getContentTypeFor(filename);

優點:Java SDK API 內建
缺點:支援的檔案類型太少

使用 JMimeMagic

@Grab(group='jmimemagic', module='jmimemagic', version='0.1.2')
import net.sf.jmimemagic.*
Magic parser = new Magic() ;
// getMagicMatch accepts Files or byte[],
// which is nice if you want to test streams
MagicMatch match = parser.getMagicMatch(new File("gumby.gif"), true);
System.out.println(match.getMimeType()) ;

優點:支援檔案類型多
缺點:檔案必須實際存在

使用 mime-util

@Grapes(
    @Grab(group='eu.medsea.mimeutil', module='mime-util', version='2.1.3')
)
import eu.medsea.mimeutil.MimeUtil;
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
File f = new File ("c:/temp/mime/test.doc");
Collection mimeTypes = MimeUtil.getMimeTypes(f);
System.out.println(mimeTypes);
//  output : application/msword

優點:函式庫迷你小巧
缺點:測試許多檔名結果都是 application/octet-stream

使用 javax.activation

@Grapes(
    @Grab(group='javax.activation', module='activation', version='1.1.1')
)
import javax.activation.MimetypesFileTypeMap;
new MimetypesFileTypeMap().getContentType("test.css");

優點:使用方法容易程式碼乾淨
缺點:和URLConnection有同樣支援類型不足問題

使用 Apache Tika


@Grab('org.apache.tika:tika-core:1.0')
@Grab('org.apache.tika:tika-parsers:1.0')
import org.apache.tika.Tika
new Tika()
//Tika.detect(new String("test"))

優點:功能完整的函式庫
缺點:未試成功

使用 jets3t

@Grab('net.java.dev.jets3t:jets3t:0.8.1')
import org.jets3t.service.utils.Mimetypes
Mimetypes.instance.getMimetype('test.css')

優點:簡單易用
缺點:需要 mime.type 設定

mime.types 可以從 Apache Httpd 下載,放到 classpath 下,就可以自動偵測檔案中有定義的類型。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!