[英]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);
如果mimetype
为text/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.