在Java中识别文件类型

时间:2014-03-21 09:17:34

标签: java file

我想检查用户是否仅上传特定的文件格式(仅限文本文件)。

我已经编写了一个验证机制,用于检查文件名之后的格式,如

filename.txt

但是,当它接受其他文件(如excel文件)时会产生一个问题,这些文件保存为.txt,如

myexcelfile.txt is being assumed as a text file even when it is an excel file

那么,要检查的唯一参数是什么,以确保上传的文件是所需的类型?

使用apache-commons uploader,servlets。

====================== EDIT =====================

根据以下答案,我试过

FileInputStream my = new FileInputStream(uploadedFile2);
InputStream inputStream = new BufferedInputStream(my);
String mimeType = URLConnection.guessContentTypeFromStream(inputStream);

但总是返回一个空值。

probe content type基于文件名扩展名,this approach也存在错误,也检查了该错误。

我不喜欢使用第三方文件验证程序,我相信这个问题会有一个合理的解决方案。

4 个答案:

答案 0 :(得分:3)

Apache Tika具有适用于content detection范围的file formats个功能。从文档中,检测内容类型的最简单方法之一是基于以下代码:

// default tika configuration can detect a lot of different file types
TikaConfig tika = new TikaConfig();

// meta data collected about the source file
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, f.toString());

// determine mime type from file contents   
String mimetype = tika.getDetector().detect
    (TikaInputStream.get(uploadedFile2), metadata);
System.out.println("File " + uploadedFile2 + " is " + mimetype);

如果mimetypetext/plain,则文件或流包含纯文本内容。

答案 1 :(得分:1)

您可以打开文件并将前几个字节读入byte[]并检查值以查看它是否与特定文件格式的已知幻数相匹配。我试着找出Excel文件会是什么(pre-XML; xlsx文件格式会识别为zip文件),但我还没有真正找到关于它的数据。到目前为止,我发现的最接近的事情是查看Java Excel文件解析器库的代码。

旧的Excel数据格式使用了所谓的BIFF。查看Apache POI library以获取解析器等文件类型。从它的外观来看,Excel文件的幻数可能是00 06 10 00(对于BIFF8工作表),或00 05 10 00(BIFF7工作表,听起来相当古老)。

答案 2 :(得分:0)

 Files.probeContentType(Paths.get("~/a.xls"))

请注意,输出取决于系统内容类型检测器 - 它可能在不同的计算机上有所不同。

至于我,这段代码返回

application/vnd.ms-excel

答案 3 :(得分:0)

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}