我从 Java 中的队列中获取文件。它们可能具有以下格式。
- 文档
- 文档
- xls
- xlsx
- 文本
- rtf
在阅读了它们的扩展之后,我想验证它们是否真的是这些类型的文件。
例如,我得到一个文件并检查它是否具有扩展名 .xls。之后,我想检查它实际上是一个 .xls 文件还是有人在更改其扩展名后上传的其他格式的文件。
编辑:我想通过实际检查文件的内容而不是扩展名来检查文件的 MIME 类型。怎么做?
我从 Java 中的队列中获取文件。它们可能具有以下格式。
在阅读了它们的扩展之后,我想验证它们是否真的是这些类型的文件。
例如,我得到一个文件并检查它是否具有扩展名 .xls。之后,我想检查它实际上是一个 .xls 文件还是有人在更改其扩展名后上传的其他格式的文件。
编辑:我想通过实际检查文件的内容而不是扩展名来检查文件的 MIME 类型。怎么做?
我不认为这是你应该解决的问题。此问题的任何解决方案都将是脆弱的,并且基于您当前对特定类型的有效文件构成的理解。
例如,获取一个 XLS 文件。您是否确定 Excel 在打开此类文件时接受什么?你能确定你会跟上未来版本中可能支持不同编码风格的任何变化吗?
问问自己——如果用户上传了错误类型的文件,可能会发生什么更糟糕的情况?也许您将文件传递给处理该文件扩展名的应用程序,您会得到一个错误?没问题,只需将其传递给用户!
不使用外部库:
您可以使用 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)));
这试图从文件的第一个字节猜测 - 请注意,这只是一个猜测 - 我发现它在大多数情况下都有效,但无法检测到一些明显的类型。
我推荐两者结合。