1、mime-util:
該工具可以通過 檢測副檔名,或者檢測magic header 兩種技術方式來實現mime類型的檢測。
比較可靠,而且輕量級、只依賴於slf4j一個包 。2010年後就沒有更新了。
POM
<dependency> <groupId>eu.medsea.mimeutil</groupId> <artifactId>mime-util</artifactId> <version>2.1.3</version></dependency>
範例程式碼:
import eu.medsea.mimeutil.MimeUtil; public class Main { public static void main(String[] args) { 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 } }
2、 JMimeMagic 通過檢測檔案尾碼名去尋找檔案類型顯然不是一個健壯的方法。 JMimeMagic是一個通過檢查magic headers來判斷檔案或者流的mime 類型的java工具包 。 目前還在持續更新當中、推薦使用。 POM
<dependency> <groupId>net.sf.jmimemagic</groupId> <artifactId>jmimemagic</artifactId> <version>0.1.4</version></dependency>
範例程式碼
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")); System.out.println(match.getMimeType()) ;
3、 java.net.URL 與上面所說的匹配尾碼名類似。尾碼名和mime-type的映射關係被定義在[jre_home]\lib\content-types.properties 該組件只根據副檔名判斷
mime-type。不是很可靠。
範例程式碼(推薦)
import java.net.FileNameMap; import java.net.URLConnection; public class FileUtils { public static String getMimeType(String fileUrl) throws java.io.IOException { FileNameMap fileNameMap = URLConnection.getFileNameMap(); String type = fileNameMap.getContentTypeFor(fileUrl); return type; } public static void main(String args[]) throws Exception { System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT")); // output : text/plain } }
範例程式碼(不推薦:這種方式也是通過副檔名判斷mime type的、而且速度很慢)
import java.net.*; public class FileUtils{ public static String getMimeType(String fileUrl) throws java.io.IOException, MalformedURLException { String type = null; URL u = new URL(fileUrl); URLConnection uc = null; uc = u.openConnection(); type = uc.getContentType(); return type; } public static void main(String args[]) throws Exception { System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT")); // output : text/plain } }
4、 javax.activation.MimetypesFileTypeMap 需要引入activation.jar這個jar包 , 他可以從下面這個網站獲得 http://java.sun.com/products/javabeans/glasgow/jaf.html .
這個MimetypesFileMap類會映射出一個file的Mime Type,這些Mime Type類型是在activation.jar包裡面的資源檔中定義的 內建的mime-type列表中的數量有限,但是它提供了方法讓您可以很方便的添加更多的mime類型
MimetypesFileTypeMap 會在使用者系統的很多地方去尋找檔案的MIME類型。當一個尋找MIME類型的請求到達後,他會按照下面這個順序去尋找MIME類型
首先通過程式將檔案添加到MimetypesFileTypeMap的一個執行個體中
尋找使用者的home路徑下的檔案 .mime.types
尋找檔案 <java.home>/lib/mime.types
尋找檔案或者資源 META-INF/mime.types
尋找檔案或者資源 META-INF/mimetypes.default (一般只在 activation.jar 中去尋找).
當你需要處理一個傳入的一般檔案命名的檔案的時候,這個方法是非常有趣的。結果出來的速度很快,因為只有副檔名被用來猜測檔案的自然屬性 範例程式碼
import javax.activation.MimetypesFileTypeMap; import java.io.File; class GetMimeType { public static void main(String args[]) { File f = new File("gumby.gif"); System.out.println("Mime Type of " + f.getName() + " is " + new MimetypesFileTypeMap().getContentType(f)); // expected output : // "Mime Type of gumby.gif is image/gif" } }