java中得到檔案MIME類型的幾種方法(轉)

來源:互聯網
上載者:User

標籤:

 本文轉載自:http://hotsunshine.iteye.com/blog/857485

 

使用 javax.activation.MimetypesFileTypeMap 
需要引入activation.jar這個jar包 , 他可以從下面這個網站獲得http://java.sun.com/products/javabeans/glasgow/jaf.html.
這個MimetypesFileMap類會映射出一個file的Mime Type,這些Mime Type類型是在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"
}
}

 

內建的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 中去尋找). 

當你需要處理一個傳入的一般檔案命名的檔案的時候,這個方法是非常有趣的。結果出來的速度很快,因為只有副檔名被用來猜測檔案的自然屬性 

使用 java.net.URL 
警告:這個方法非常慢 
與上面所說的匹配尾碼名類似。尾碼名和mime-type的映射關係被定義在[jre_home]\lib\content-types.properties這個檔案中

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
}
}


來自R. Lovelock 的筆記: 
我嘗試去找一個最好的能擷取mime type的類型的方法,發現你的發現很有用,但是現在我發現,可以通過URLConnection來尋找,並沒有像你描述的那麼慢 

 

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
}
}
}

 

使用 Apache Tika 
Tika是lucene的子項目,它是通過已經存在的解析庫在各種文檔中尋找並提取中繼資料和結構化常值內容的工具包。 
這個包提供了罪行檔案類型的支援,包括office2007(docs/pptx/xlsx/etc...)

Apache Tika 
Tika有很多依賴包,大約有20個jar包!但是它所能做的不僅僅是檢測檔案類型這麼簡單,例如,你可以解析PDF或者DOC檔案,並很容易的擷取文本和中繼資料

import java.io.File;
import java.io.FileInputStream;

import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;

public class Main {

public static void main(String args[]) throws Exception {

FileInputStream is = null;
try {
File f = new File("C:/Temp/mime/test.docx");
is = new FileInputStream(f);

ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());
Parser parser = new AutoDetectParser();
// OOXMLParser parser = new OOXMLParser();
parser.parse(is, contenthandler, metadata);
System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE));
System.out.println("Title: " + metadata.get(Metadata.TITLE));
System.out.println("Author: " + metadata.get(Metadata.AUTHOR));
System.out.println("content: " + contenthandler.toString());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (is != null) is.close();
}
}
}

 

 

 

使用JMimeMagic 
通過檢測檔案尾碼名去尋找檔案類型顯然不是一個健壯的方法。JMimeMagic庫提供了更健壯的檢測方法,他是一個通過檢查magic headers來判斷檔案或者流的mime 類型的java工具包

// snippet for JMimeMagic lib 
//     http://sourceforge.net/projects/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"));
System.out.println(match.getMimeType()) ;

 

使用 mime-util

另一個工具是mime-util,這個工具可以通過 檢測副檔名,或者檢測magic header 兩種技術方式來實現mime類型的檢測

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
}
}

mime-util的比較好的一點是它是輕量級的,只依賴於slf4j一個包

 

 

java中得到檔案MIME類型的幾種方法(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.