基于文件扩展名validation文件
我从Java中的队列中获取文件。 他们可能是以下格式。
- DOCX
- PDF格式
- DOC
- XLS
- XLSX
- 文本
- 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的文件,情况会怎样? 也许你会传递文件到处理文件扩展名的应用程序,你会得到一个错误? 不是一个问题,只是把它传递给用户!