【问题标题】:Validation of files based on their file extensions根据文件扩展名验证文件
【发布时间】:2012-11-06 09:51:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您确定需要这样做吗?您不能将文件传递给需要使用它的任何进程,并在文件无效时处理异常吗?
  • 另外,如果不指定一些任意限制,您将无法验证 .txt 文件。
  • @Duncan ...实际上该文件正在存储到文件系统中。所以在我们存储之前,我们要检查它是否是有效的文件。有道理吗?
  • 不适合我,恐怕。如果文件在我开始使用时有效,我会更感兴趣。特别是,该问题的任何解决方案都将无法扩展,需要对每种新支持的文件类型进行更改。

标签: java excel pdf file-upload ms-word


【解决方案1】:

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

例如,获取一个 XLS 文件。您是否确定 Excel 在打开此类文件时接受什么?您能确定您会及时了解未来版本中可能支持不同编码样式的任何更改吗?

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

【讨论】:

  • 我只是想通过实际内容而不是扩展名来检查文件的 mime 类型。
  • @Ahmad 我明白你想做什么。我建议(出于上述原因)这可能不是一个好主意。
【解决方案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)));

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

我建议两者结合。

【讨论】:

  • 这是一个答案吗?您似乎只是将文件扩展名映射到 mime 类型,而不是按照 OP 的要求验证内容。
  • 对不起 - 我记得我过去也遇到过同样的问题,只是从我的代码中复制了错误的解决方案!
  • 在您提出最后建议后,我删除了 -1。但我仍然相信这是一个愚蠢的差事:-)
  • File f= new File(...); => 这(...)意味着您需要枚举扩展?
猜你喜欢
  • 2016-02-15
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2011-04-07
  • 2014-11-06
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多