2

我从 Java 中的队列中获取文件。它们可能具有以下格式。

  1. 文档
  2. pdf
  3. 文档
  4. xls
  5. xlsx
  6. 文本
  7. rtf

在阅读了它们的扩展之后,我想验证它们是否真的是这些类型的文件。

例如,我得到一个文件并检查它是否具有扩展名 .xls。之后,我想检查它实际上是一个 .xls 文件还是有人在更改其扩展名后上传的其他格式的文件。

编辑:我想通过实际检查文件的内容而不是扩展名来检查文件的 MIME 类型。怎么做?

4

2 回答 2

3

我不认为这是你应该解决的问题。此问题的任何解决方案都将是脆弱的,并且基于您当前对特定类型的有效文件构成的理解。

例如,获取一个 XLS 文件。您是否确定 Excel 在打开此类文件时接受什么?你能确定你会跟上未来版本中可能支持不同编码风格的任何变化吗?

问问自己——如果用户上传了错误类型的文件,可能会发生什么更糟糕的情况?也许您将文件传递给处理该文件扩展名的应用程序,您会得到一个错误?没问题,只需将其传递给用户!

于 2012-11-06T11:26:07.257 回答
2

不使用外部库:

您可以使用 MimetypesFileTypeMap 获取文件 mimetype:

    File f = new File(...);
    System.out.println(new MimetypesFileTypeMap().getContentType(f));

您可以通过以下方式获得类似的结果: URLConnection.guessContentTypeFromName 根据文档,这两种解决方案都只查看扩展名。

更好的选择:URLConnection.guessContentTypeFromStream

    File f= new File(...);
    System.out.println(URLConnection.guessContentTypeFromStream(new FileInputStream(f)));

这试图从文件的第一个字节猜测 - 请注意,这只是一个猜测 - 我发现它在大多数情况下都有效,但无法检测到一些明显的类型。

我推荐两者结合。

于 2012-11-06T09:54:25.880 回答