【问题标题】:java library to find the mime type from file content [duplicate]java库从文件内容中查找mime类型[重复]
【发布时间】:2011-05-19 22:15:39
【问题描述】:

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

【问题讨论】:

  • 解决方案怎么样here。他们不适合你吗?
  • mime util 不适用于 microsoft docx 文件。 Mime util 将其报告为 application/zip。我期待更具体的,比如 application/vnd.openxmlformats-officedocument.wordprocessingml.document。我发现 apache tika 为我工作。
  • 链接中显示的代码 sn-p 有效,但不适用于 Microsoft docx 等文件。
  • 我不认为这与引用的问题重复,因为作者明确要求通过文件内容进行检测,而另一个问题的解决方案是指文件(包括文件名)。跨度>

标签: java mime file-type


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 Apache tika 进行内容检测。请在下面找到链接。 http://tika.apache.org/0.8/detection.html。我们有很多 jar 依赖项,您可以在使用 maven 构建 tika 时找到它们

            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 插件来创建一个 uber jar,这可能是一个问题。
    【解决方案3】:

    也许对需要最常用的办公格式(并且不使用 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)) {。感谢您的代码!
    猜你喜欢
    • 2011-06-25
    • 2012-09-04
    • 1970-01-01
    • 2013-06-08
    • 2018-07-19
    • 2013-02-05
    • 2013-04-30
    • 2011-02-02
    相关资源
    最近更新 更多