基于文件扩展名validation文件

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

  1. DOCX
  2. PDF格式
  3. DOC
  4. XLS
  5. XLSX
  6. 文本
  7. RTF

读完扩展后,我想validation它们是否实际上是这些types的文件。

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

编辑:我想通过实际检查其内容,而不是其扩展名来检查文件的MIMEtypes。 如何做到这一点?

不使用外部库:

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

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

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

一个更好的select: URLConnection.guessContentTypeFromStream

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

这试图从文件的第一个字节猜测 – 被警告这只是一个猜测 – 我发现它在大多数情况下工作,但未能检测到一些明显的types。

我build议两者的组合。

我不认为这是你应该解决的问题。 任何解决这个问题的方法都是脆弱的,并且基于你目前对什么构成特定types的有效文件的理解。

例如,拿一个XLS文件。 你知道Excel在打开这样的文件时可以接受吗? 你可以确定你会跟上未来版本的任何变化,可能支持不同的编码风格吗?

问问自己 – 如果用户上传错误types的文件,情况会怎样? 也许你会传递文件到处理文件扩展名的应用程序,你会得到一个错误? 不是一个问题,只是把它传递给用户!