我想检查用户是否仅上传特定的文件格式(仅限文本文件)。
我已经编写了一个验证机制,用于检查文件名之后的格式,如
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也存在错误,也检查了该错误。
我不喜欢使用第三方文件验证程序,我相信这个问题会有一个合理的解决方案。
答案 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);
如果mimetype
为text/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);
}