`

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

    博客分类:
  • java
阅读更多
使用 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
分享到:
评论

相关推荐

    MimeType文件校验demo

    在Java中,有多种方法可以获取文件的MimeType: 1. 使用`java.nio.file.Files`类的`probeContentType()`方法: 这是Java 7引入的新特性,可以直接对文件进行MimeType探测。例如: ```java Path path = Paths.get...

    常用的MIME TYPE类型枚举类Enum整理 静态方法直接检索使用

    智能检索:提供基于文件扩展名的MIME类型查询方法,只需一行代码即可获取,极大提升了开发效率。 易用性:采用枚举类型设计,避免了硬编码带来的困扰,使代码更加清晰、易于理解和维护。 高度定制:支持轻松添加...

    Java 读取图片的mimeType的方法

    Java 读取图片的mimeType的方法是指通过编解码的方式判断图片是否合法,从而获取图片的mimeType。这种方法可以避免通过文件后缀名来判断图片格式的不可靠性。下面是 Java 读取图片的mimeType的方法的详细介绍: 一...

    java-enum-mimetype:MIME 类型的 Java 枚举类

    `java-enum-mimetype`项目提供了一个使用Java枚举实现的MIME类型管理类,使得在Java程序中操作MIME类型变得更加简单和规范。 在Java中创建一个MIME类型的枚举类,可以遵循以下步骤: 1. **定义枚举类**: 首先,...

    java 获取文件的真实类型依赖.zip

    在Java编程中,获取文件的真实类型是一个常见的需求,特别是在处理用户上传或系统间交互的数据时。文件的真实类型可能与它的扩展名不符,因此单纯依靠扩展名来判断文件类型是不安全的。本教程将深入探讨如何在Java中...

    web.xml中的mime-type标签作用与使用

    通过这些映射,服务器能够根据不同的文件类型发送相应的MIME-Type头,从而确保客户端正确地解析和处理这些文件。 #### 总结 `web.xml`中的`mime-mapping`元素是Java Web应用中非常关键的一部分,它负责定义文件...

    Java获取MIME开源类库jmimemagic-0.1.2.jar

    在Http请求中,有时需要知道Content-Type类型,尤其是上传文件时,更为重要,虽然有些办法可以解决,但都不太准确或者繁琐.jMimeMagic是一个用来检测文件或者数据流的 MIME 类型的 Java 类库。 最新版本是V 0.1.2。...

    获取文件类型.rar

    在编程中,例如在Node.js中,可以使用`fs`和`mimetype`库来获取文件类型: ```javascript const fs = require('fs'); const mime = require('mime-types'); fs.readFile('example.txt', 'binary', (err, data) =&gt; ...

    Java获取文件的类型和扩展名的实现方法

    在Java编程中,获取文件的类型和扩展名是常见的任务,这对于处理文件系统中的各种文件至关重要。本篇文章将深入探讨如何实现这一功能,并提供具体的实例代码。 首先,我们需要理解文件类型和扩展名的概念。文件类型...

    MIME-java.rar_java mime_javamime_mime_mime java_邮件 解析

    首先,从邮件服务器获取`MimeMessage`,然后调用`getContent()`方法,根据返回的`MIMEType`来决定如何进一步处理。 7. **编码与解码**:在邮件传输过程中,为了兼容不同的字符集和避免某些特殊字符出现问题,MIME还...

    获取文件类型的源代码资源

    在IT领域,获取文件类型是一项基础且重要的任务。...理解这些方法可以帮助我们在各种情况下准确地识别和处理不同类型的文件。在实际应用中,确保安全性和效率是非常重要的,例如,避免打开可能包含恶意代码的未知文件。

    mime工具类

    2. **获取MIME类型**:在Java中,可以使用`java.nio.file.Files`类的`probeContentType()`方法来探测文件的MIME类型,或者使用`javax.activation.MimetypesFileTypeMap`来根据文件扩展名获取MIME类型。其他语言如...

    httpmime-4.1.2.jar org.apache.http.entity.mime

    - MIME类型是描述文件类型的标准,如"image/jpeg"或"audio/mpeg"。在HTTP请求中,通过Content-Type头来指定请求或响应的MIME类型,以告知服务器或客户端数据的类型。 - HttpMime库提供了`MimeMultipart`类,用于...

    java 下载文件MMTYPE类型大全

    在Java中,你可以使用`javax.activation.MimeType`类来处理和识别MIME类型。当处理文件下载时,通常会用到`java.io.File`和`java.net.HttpURLConnection`或`javax.servlet.http.HttpServletResponse`来设置响应头中...

    httpmime jar包

    在Java开发中,我们经常需要处理HTTP协议下的MIME(Multipurpose Internet Mail Extensions)类型数据,比如上传或下载文件、发送带有附件的邮件等。Apache HttpClient项目提供了一个强大的工具——httpmime-4.3.jar...

    java多文件上传

    例如,要确保上传的文件类型安全,防止恶意文件的上传,可以通过检查文件扩展名或者使用MIME类型进行验证。此外,为了防止文件覆盖,可以生成唯一的文件名或在保存前检查文件是否已存在。 另外,如果是在Web应用中...

    React获取Java后台文件流并下载Excel文件流程解析

    * `Content-Disposition`: 设置浏览器下载文件时的文件名和mime类型。 * `Access-Control-Expose-Headers`: 允许浏览器访问header中的FileName。 * `FileName`: 设置文件名,并对其进行URL编码,以防止中文乱码。 ...

    文件上传java测试程序.rar

    可以检查文件扩展名,或者使用更安全的方法,如检查文件的MIME类型。 9. **性能优化**: 对于大文件上传,考虑使用分块上传或者异步上传,以提高用户体验和系统性能。 10. **文件重命名**: 为了避免文件名冲突...

    java文件上传功能

    - 检查文件类型:验证上传文件的MIME类型,防止恶意文件上传。 - 文件重命名:为避免文件名冲突,上传后重命名文件。 - 防止路径遍历:确保文件被写入预定的安全目录,避免访问服务器上的其他敏感文件。 6. **...

Global site tag (gtag.js) - Google Analytics