当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java获取文件类型Mime Type的各种方法

发表于: 2011-01-01   作者:hotsunshine   来源:转载   浏览次数:
摘要: 使用 javax.activation.MimetypesFileTypeMap 需要引入activation.jar这个jar包 , 他可以从下面这个网站获得 http://java.sun.com/products/javabeans/glasgow/jaf.html. 这个MimetypesFileMap类会映射出一个file的Mime Type,这些Mime Type类型是在acti
使用 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一个包


英文水平有限,就是大体意思,原文地址 http://www.rgagnon.com/javadetails/java-0487.html

Java获取文件类型Mime Type的各种方法

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
IIS7中下载apk文件会报404错误。 找到:IIS目录,MIME类型 添加.apk文件的MIME类型。 文件扩展名:.
< ![CDATA[ var x = MimeMapping.GetMimeMapping(@"sss.txt"); 在asp.net 4.5里面新增加了MimeMa
脚本的代码放在 Google Code 上, CSS 和 JS 均直接调用 SVN 主干文件. 改写脚本的时候发现 IE6 以外
Win7 在IIS中增加MIME类型文件,步骤如下: http://blog.csdn.net/aminfo/article/details/7820520
本文转自:http://xingxing5421.blog.163.com/blog/static/119446319201141133648731/?fromdm&fromS
当Input框需要输入数字时,一般用到type='number' 但是在输入框有 上下小箭头 google后有解决CSS方
今天上传一个html5后台管理模版的时候,在服务器上预览发现网页加载的远程woff类型的字体不显示,如
在iis中能够浏览所有扩展名的文件时,IIS MIME的 映射 您只能在故障排除过程中将通配符映射添加到 I
Java和SQL各自有一套自己定义的数据类型(jsp的数据类型实际上就是Java的数据类型),我们要在Jsp程
Java和SQL各自有一套自己定义的数据类型(jsp的数据类型实际上就是Java的数据类型),我们要在Jsp程
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号