【问题标题】:Estimate if file is MIME type估计文件是否为 MIME 类型
【发布时间】:2013-02-15 19:09:12
【问题描述】:

此方法应检查文件是否为 MIME 类型。为了实现这个目标,我正在使用方法probeContentType()
然而,也许是决定相同问题的另一种方式。还有哪些其他选择(如果有的话)?

代码:

class ProbeContentTypeCheker implements Checker {

    @Override
    public boolean check(File fileCheck) {
        try {
            Path filePath = FileSystems.getDefault().getPath(
                    fileCheck.getAbsolutePath());
            if ((Files.probeContentType(filePath) != null)) {
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return false;
    }
}

问题:

  • 还有其他方法可以检查文件中的 MIME 类型吗?

【问题讨论】:

    标签: java mime-types


    【解决方案1】:

    有两种获取文件 mime 类型的方法:

    1. 通过文件的magic number 进行识别 - 这是一种可靠的方法,但需要从文件中读取信息
    2. 通过文件扩展名猜测 - 这是一种快速的方法,但可能不太准确

    以下解决方案使用第一种方法:

    1. Apache Tika - 一个使用现有解析器库从各种文档中检测和提取元数据和结构化文本内容的工具包
    2. JMimeMagic - 用于确定文件或流的 MIME 类型的 Java 库
    3. mime-util - 使 Java 程序能够根据文件扩展名、魔术数据和内容嗅探检测 MIME 类型

    以下解决方案使用第二种方法:

    1. javax.activation.MimetypesFileTypeMap - JavaBeans 激活框架的这一部分。 MimetypesFileTypeMap 在用户系统的不同位置查找 MIME 类型文件条目。
    2. 使用 java.net.URL - 扩展名和 mime 类型之间的映射在文件 [jre_home]/lib/content-types.properties 中定义

    有关更多信息,请参阅post

    【讨论】:

    • 您能否添加另一个检查 MIME 类型的变体(枚举列表)?
    • 你介意我问一下,如果你能看到this SO Question
    • 谢谢。我最终使用了mime-util,即使在 9GB 以上的文件上也能很好地工作。
    【解决方案2】:

    如果您不能使用 Java 7,另一种选择是使用 URLConnection.guessContentTypeFromName(String fileName)。 注意,如果无法猜到内容类型,该方法将返回null

    【讨论】:

      【解决方案3】:

      您可以使用String mimeType = new MimetypesFileTypeMap().getContentType(theFile);

      请注意,如果未找到 MIME 类型,则返回 application/octet-stream 而不是 null

      【讨论】:

      • getContentType(theFile) => 我们可以在那里查看theFile.getAbsolutePath()吗?修复后 - 这是有效的check(File fileCheck)吗?
      • public boolean check(File fileCheck) { String mimeType = new MimetypesFileTypeMap().getContentType(fileCheck); if (mimeType == null) { return false; } 返回真; } - 这是正确的吗?
      • @nazar_art 不,因为正如我所说,如果没有找到 MIME 类型,则返回 application/octet-stream 而不是 nullapplication/octet-stream 通常是任何文件的默认 MIME 类型,如果没有找到其他更具体的类型。
      • 如果MimetypesFileTypeMap() 不正确?我们如何修复这种方法并证明良好的工作文件检查方法?
      • 复制 MimetypesFileTypeMap 类的源代码并将静态变量 'defaultType' 设置为 null。但除非有特定原因,否则我不会这样做。您可能需要添加其他 mime 类型,请参阅 stackoverflow.com/questions/6308142/…
      猜你喜欢
      • 2012-11-20
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多