Java库:从文件内容中查找MIME类型

14

我正在寻找一个Java库,可以通过查看文件内容(字节数组)告诉您mime类型。我发现这个项目使用jmimemagic,但它不再支持较新的文件类型(例如MS Word docx格式),因为它现在处于非活动状态(自2006年以来)。


3
这是mime-util项目的下载页面,您可以在此下载版本为2.1.3的mime-util软件。 - khachik
这里的解决方案怎么样?它们对你不起作用吗?(http://www.rgagnon.com/javadetails/java-0487.html) - javamonkey79
Mime util对于Microsoft Docx文件无法正常工作。Mime util将其报告为application/zip。我期望得到更具体的结果,例如application/vnd.openxmlformats-officedocument.wordprocessingml.document。我发现Apache Tika适合我的需求。 - Ajith Jose
链接中展示的代码片段可以工作,但并不适用于Microsoft docx等文件。 - Ajith Jose
2
我认为这不是重复的问题,因为作者明确要求通过文件内容进行检测,而其他问题的解决方案则涉及到文件(包括文件名)。 - danielp
3个回答

12

或许对某些人有用,他们需要最常用的办公格式(而且不使用Apache Tika):

public class MimeTypeUtils {

    private static final Map<String, String> fileExtensionMap;

    static {
        fileExtensionMap = new HashMap<String, String>();
        // MS Office
        fileExtensionMap.put("doc", "application/msword");
        fileExtensionMap.put("dot", "application/msword");
        fileExtensionMap.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        fileExtensionMap.put("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template");
        fileExtensionMap.put("docm", "application/vnd.ms-word.document.macroEnabled.12");
        fileExtensionMap.put("dotm", "application/vnd.ms-word.template.macroEnabled.12");
        fileExtensionMap.put("xls", "application/vnd.ms-excel");
        fileExtensionMap.put("xlt", "application/vnd.ms-excel");
        fileExtensionMap.put("xla", "application/vnd.ms-excel");
        fileExtensionMap.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        fileExtensionMap.put("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template");
        fileExtensionMap.put("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12");
        fileExtensionMap.put("xltm", "application/vnd.ms-excel.template.macroEnabled.12");
        fileExtensionMap.put("xlam", "application/vnd.ms-excel.addin.macroEnabled.12");
        fileExtensionMap.put("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12");
        fileExtensionMap.put("ppt", "application/vnd.ms-powerpoint");
        fileExtensionMap.put("pot", "application/vnd.ms-powerpoint");
        fileExtensionMap.put("pps", "application/vnd.ms-powerpoint");
        fileExtensionMap.put("ppa", "application/vnd.ms-powerpoint");
        fileExtensionMap.put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
        fileExtensionMap.put("potx", "application/vnd.openxmlformats-officedocument.presentationml.template");
        fileExtensionMap.put("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow");
        fileExtensionMap.put("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12");
        fileExtensionMap.put("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12");
        fileExtensionMap.put("potm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12");
        fileExtensionMap.put("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12");
        // Open Office
        fileExtensionMap.put("odt", "application/vnd.oasis.opendocument.text");
        fileExtensionMap.put("ott", "application/vnd.oasis.opendocument.text-template");
        fileExtensionMap.put("oth", "application/vnd.oasis.opendocument.text-web");
        fileExtensionMap.put("odm", "application/vnd.oasis.opendocument.text-master");
        fileExtensionMap.put("odg", "application/vnd.oasis.opendocument.graphics");
        fileExtensionMap.put("otg", "application/vnd.oasis.opendocument.graphics-template");
        fileExtensionMap.put("odp", "application/vnd.oasis.opendocument.presentation");
        fileExtensionMap.put("otp", "application/vnd.oasis.opendocument.presentation-template");
        fileExtensionMap.put("ods", "application/vnd.oasis.opendocument.spreadsheet");
        fileExtensionMap.put("ots", "application/vnd.oasis.opendocument.spreadsheet-template");
        fileExtensionMap.put("odc", "application/vnd.oasis.opendocument.chart");
        fileExtensionMap.put("odf", "application/vnd.oasis.opendocument.formula");
        fileExtensionMap.put("odb", "application/vnd.oasis.opendocument.database");
        fileExtensionMap.put("odi", "application/vnd.oasis.opendocument.image");
        fileExtensionMap.put("oxt", "application/vnd.openofficeorg.extension");
    }

    public static String getContentTypeByFileName(String fileName) {
        // 1. first use java's buildin utils
        FileNameMap mimeTypes = URLConnection.getFileNameMap();
        String contentType = mimeTypes.getContentTypeFor(fileName);
        // 2. nothing found -> lookup our in extension map to find types like ".doc" or ".docx"
        if (!StringUtils.hasText(contentType)) {
            String extension = FilenameUtils.getExtension(fileName);
            contentType = fileExtensionMap.get(extension);
        }
        return contentType;
    }
}

我不得不将 if (!StringUtils.hasText(contentType)) { 更改为 if (StringUtils.isBlank(contentType)) {。感谢您提供的代码! - Joshua Pinter

6
使用Apache Tika进行内容检测。请查看以下链接:http://tika.apache.org/0.8/detection.html。当您使用Maven构建Tika时,可以找到许多JAR依赖项。
        ByteArrayInputStream bai = new ByteArrayInputStream(pByte);
        ContentHandler contenthandler = new BodyContentHandler();
        Metadata metadata = new Metadata();
        Parser parser = new AutoDetectParser();
        try {
              parser.parse(bai, contenthandler, metadata);

        } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        } catch (SAXException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        } catch (TikaException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        }           
        System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE));
        return metadata.get(Metadata.CONTENT_TYPE);

请注意:与大多数Apache库一样,这个库将会让你的依赖关系变得非常复杂。如果你正在使用shade maven插件创建一个超级jar包,这可能是一个问题。 - TheRealChx101

2
我使用javax.activation.MimetypesFileTypeMap。它从一个小集合开始:$JRE_HOME/lib/content-types.properties,但您可以添加自己的内容。按照MimetypesFileTypeMap的javadoc中所示的格式创建一个mime.types文件(我从网络上获取了一个大列表,对其进行了修改,并添加了一些缺失的类型)。现在,您可以通过打开mime.types文件并将其内容添加到您的映射中来在代码中添加该文件。然而,更简单的解决方案是将mime.types文件添加到您的jar的META-INF中。java.activation会自动捕获它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接