问题是我们尝试使用JarFile类来确定文件是否是Jar文件。
但是,如果我们这样做,docx文件也将被视为Jar文件。
因为docx文件实际上是一个zip文件。
这是我的代码:
public static boolean detectJarFile(String file) throws IOException {
try {
JarFile jarFile = new JarFile(file);
} catch (java.util.zip.ZipException e) {
// the uploaded file is NOT JAR file
return false;
}
return true;
}
如何知道文件是否真的是Jar文件?
有什么想法吗?
答案 0 :(得分:4)
可执行的.jar文件应该有一个“幻数”
我找到了一些枚举此数字的地方: 根据大多数地方,数字是十六进制的0xCAFEBABE。
我在Oracle的论坛上发现了这个讨论: https://forums.oracle.com/forums/thread.jspa?threadID=2470576&tstart=0
此外,在JAR文件概述中,它提到“Solaris 2.6内核已经扩展为识别标识JAR文件的特殊”魔术“数字”: http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jarGuide.html
此外,要获得更深入的信息,请查看the jar file specifications at Oracle.
答案 1 :(得分:3)
一般来说,Jar文件只不过是一个带有一些特殊属性的zip文件(“普通”zip文件可能有,但不一定有。)
JAR文件是基于流行的ZIP文件格式的文件格式,用于聚合许多文件格式 文件合而为一。 JAR文件本质上是一个包含可选META-INF目录的zip文件。
所以,看看你的候选人是否有这样的目录。如果它(并且至少有MANIFEST.MF
具有正确的格式),则它是一个jar文件。
但是作为一个jar文件没什么特别的,这个知识并没有真正给你任何东西。它并不一定意味着你可以在那里执行类。
例如,OpenOffice.org文件格式(至少是旧的,我不确定OpenDocument)是基于jar格式的。
答案 2 :(得分:3)
//上传的文件不是JAR文件
是的,确实如此。这里的问题是你假设关于JAR的某些事情是不正确的。与此处的其他一些答案相反,JAR文件的only requirement是ZIP格式。 META-INF / MANIFEST.MF文件是可选的。 jar不需要包含.class文件。它不需要是ZIP文件。您应该重新表述您的问题,以准确说明您正在寻找的是什么,因为它不是JAR。我怀疑你想验证那些不是的东西。
答案 3 :(得分:2)
您可以检查文件contains是否为MANIFEST.MF条目。
public static boolean detectJarFile(String file) throws IOException {
...
// First check if this is a zip file.
// Then do this.
ZipFile zip = new ZipFile(file);
boolean hasManifestEntry = zip.getEntry("META-INF/MANIFEST.MF") != null;
zip.close();
return hasManifestEntry;
}
答案 4 :(得分:2)
除了Kal提供的答案之外,请检查文件是否包含至少一个扩展名为“.class”的文件。否则jar文件将无效,几乎所有'.docx'文件都不会有这样的文件。