估计文件是否为MIME类型

8

这个方法应该用于检查文件的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类型,还有其他替代方案吗?
3个回答

6

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

  1. 通过文件的魔数进行识别 - 这是一种可靠的方法,但需要读取文件中的信息。
  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


1
你能否添加另一种变体来检查 MIME 类型(枚举列表)? - catch23
你介意我问一下吗?你能否看到这个 Stack Overflow 的问题:https://dev59.com/PG_Xa4cB1Zd3GeqP1XYX。 - catch23
谢谢。我最终使用了“mime-util”,它甚至在一个9GB以上的文件上也表现得非常出色。 - Bob

1

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

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


1
getContentType(theFile) => 我们可以检查一下 theFile.getAbsolutePath() 吗?修正后,这个 check(File fileCheck) 是合法的吗? - catch23
1
public boolean check(File fileCheck) { String mimeType = new MimetypesFileTypeMap().getContentType(fileCheck); if (mimeType == null) { return false; } return true; } - 这个正确吗? - catch23
@nazar_art 不是的,因为如我所说,如果没有找到MIME类型,则返回application/octet-stream而不是null。如果没有找到其他更具体的MIME类型,application/octet-stream通常是任何文件的默认MIME类型。 - sp00m
1
如果这个MimetypesFileTypeMap()不正确,我们该如何修复这个方法并证明文件检查方法的良好工作? - catch23
复制MimetypesFileTypeMap类的源代码并将静态变量"defaultType"设置为空。但除非有特定的原因,否则我不会这样做。您可能需要添加其他MIME类型,请参见https://dev59.com/rG015IYBdhLWcg3w7wQW。 - Adisesha
@Adi 在这种情况下,哪种变体更好? - catch23

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

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