关闭

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

标签: javaimportstringexceptionfile
14758人阅读 评论(1) 收藏 举报
分类:
  本文转载自: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一个包

0
3
查看评论

根据流读取文件类型

package apistudy;          import java.awt.image.BufferedImage;   import java.io.F...
  • dbeautifulLife
  • dbeautifulLife
  • 2017-03-20 10:01
  • 436

Java依据文件头获取文件类型

ava根据文件头获取文件类型     文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 ...
  • diquren
  • diquren
  • 2015-11-10 18:55
  • 2658

使用Java获取文件类型

Using Java 7 Files.html#probeContentType import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file...
  • KimSoft
  • KimSoft
  • 2016-09-17 22:40
  • 2342

Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法:1. 通过后缀名,如exe,jpg,bmp,rar,zip等等。2. 通过读取文件,获取文件的Content-type来判断。3. 通过读取文件流,根据文件流中特定的一些字节标识来区分不...
  • shixing_11
  • shixing_11
  • 2010-07-02 00:19
  • 42593

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

本文转载自:http://hotsunshine.iteye.com/blog/857485 使用 javax.activation.MimetypesFileTypeMap  需要引入activation.jar这个jar包 , 他可以从下面这个网站获得http://java.s...
  • WheroJ
  • WheroJ
  • 2015-12-07 17:25
  • 3046

从文件路径中获取文件名(含格式)、文件类型、文件名

如:“E:\新建 文本文档.txt”
  • C_S_D_N_USER
  • C_S_D_N_USER
  • 2014-05-27 14:52
  • 1521

【web】获取文件类型

获取文件类型
  • michael_ouyang
  • michael_ouyang
  • 2016-11-01 18:01
  • 353

android--------根据文件路径使用File类获取文件相关信息

Android通过文件路径如何得到文件相关信息,如 文件名称,文件大小,创建时间,文件的相对路径,文件的绝对路径等。 如图: public class MainActivity extends Activity { private String path = "/s...
  • DickyQie
  • DickyQie
  • 2016-12-30 17:31
  • 5256

java的FileInputStream类读取文件

package net.csdn.InputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; /** * Created by rabbit先生 ...
  • sinat_32366329
  • sinat_32366329
  • 2017-03-11 13:43
  • 3257

java判断文件的真实类型

在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。 比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。 java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下: package com.z...
  • foget_over
  • foget_over
  • 2016-07-17 15:58
  • 3924
    个人资料
    • 访问:1226950次
    • 积分:8978
    • 等级:
    • 排名:第2508名
    • 原创:63篇
    • 转载:12篇
    • 译文:8篇
    • 评论:565条
    关于@我

    【我是谁】:一个有点文艺范的软件工程师


    【怎么交流】:如有疑问,请在相关文章后提出问题或私信给我,我基本每天都上线


    在CSDN代码库中我将分享比较完整的代码示例和开源项目,欢迎大家fork或向我索取commit权限


    https://code.csdn.net/chaijunkun

    博客专栏