繁体   English   中英

识别Java中的文件类型

[英]Identify File Type in Java

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

我编写了一种验证机制,可以在文件名之后检查格式,如下所示

filename.txt

但是,当它也接受另存为.txt的其他文件(例如excel文件)时,这就产生了一个问题

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

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

使用apache-commons上载器servlet。

======================编辑=====================

根据以下答案,我尝试了

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

但是总是返回一个空值。

探针内容类型基于文件扩展名,并且此方法也存在错误,请检查是否存在。

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

Apache Tika具有适用于多种文件格式的 内容检测功能。 从文档中,检测内容类型的最简单方法之一是基于以下代码:

// 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 ,则文件或流包含纯文本内容。

您可以打开文件,并将前几个字节读入byte[]然后检查值以查看它是否与特定文件格式的已知幻数相匹配。 我尝试找出对Excel文件(XML之前的格式; xlsx文件格式将其标识为zip文件)的含义,但是我还没有真正找到有关此文件的大量数据。 到目前为止,我发现的最接近的内容是查看Java Excel文件解析器库的代码。

旧的Excel数据格式使用了所谓的BIFF。 签出Apache POI库以进行解析器以及此类文件。 从它的外观看,Excel文件的魔幻数可能是00 06 10 00 (对于BIFF8工作表)或00 05 10 00 (BIFF7工作表,听起来很旧)。

尝试

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

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

对于我来说,此代码返回

application/vnd.ms-excel
private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM