Java 如何在保存到磁盘之前验证ZipFile的内容

Java 如何在保存到磁盘之前验证ZipFile的内容,java,file-upload,upload,zipfile,Java,File Upload,Upload,Zipfile,我有一个应用程序,需要用户上传一个zipfile,其中包含xml报告文件和其他文件 我想做的是,验证它是一个zip,然后打开并检查是否有xml文件,并验证该xml中需要的一些节点 我想在将这个zipfile保存到磁盘/文件系统之前执行此操作,并创建一个临时文件。我将只保存通过验证的文件 我正在使用Springmultipartcommonmultipartfile来管理上传 该应用程序使用Java、jsp、tomcat 谢谢。如果您想检查一个文件是否是ZIP文件,也许可以使用URLConnect

我有一个应用程序,需要用户上传一个zipfile,其中包含xml报告文件和其他文件

我想做的是,验证它是一个zip,然后打开并检查是否有xml文件,并验证该xml中需要的一些节点

我想在将这个zipfile保存到磁盘/文件系统之前执行此操作,并创建一个临时文件。我将只保存通过验证的文件

我正在使用Spring
multipartcommonmultipartfile
来管理上传

该应用程序使用Java、jsp、tomcat


谢谢。

如果您想检查一个文件是否是ZIP文件,也许可以使用
URLConnection
类的getContentType()方法?大概是这样的:

URL u = new URL(fileUrl);
URLConnection uc = u.openConnection();
String type = uc.getContentType();

但是,如果要检查文件是否为ZIP文件,则检测ZIP格式中的
504b

如果您想检查文件是否为ZIP文件,也许可以使用
URLConnection
类的getContentType()方法?大概是这样的:

URL u = new URL(fileUrl);
URLConnection uc = u.openConnection();
String type = uc.getContentType();

但是,对于ZIP格式,它将更快地检测出
504b

请参见我在OP上关于在内存中缓冲整个文件的智慧的评论


对有效zip文件的第一个快速检查是检查前4个字节是否有适当的“魔法”字节。zip文件应以前4个字节开始
{(字节)0x50,(字节)0x4b,(字节)0x03,(字节)0x04}
。然而,真正检查它的唯一方法是尝试解压它。

请参阅我在OP上关于在内存中缓冲整个文件是否明智的评论


对有效zip文件的第一个快速检查是检查前4个字节是否有适当的“魔法”字节。zip文件应以前4个字节开始
{(字节)0x50,(字节)0x4b,(字节)0x03,(字节)0x04}
。但是,真正检查它的唯一方法是尝试解压缩它。

检查,它们显示了一些使用Java的ZIP操作,这些操作可能很有用。这似乎不太安全。如果在服务器上接收文件的全部内容并将其保留在内存中,则可能会导致服务器内存不足。在处理未知大小的流之前,将其写入临时文件几乎总是健壮服务器实现的最佳选择。@jtahlborn我想他可以设置文件最大大小并进行检查,以便上传不会超过允许的文件大小。如果只接受小文件,似乎没有必要先在磁盘上保存。同时检查@PederN-我没有看到任何迹象表明OP只接受小文件。检查,它们显示了一些使用Java的ZIP操作,可能会很有用。这看起来不太安全。如果在服务器上接收文件的全部内容并将其保留在内存中,则可能会导致服务器内存不足。在处理未知大小的流之前,将其写入临时文件几乎总是健壮服务器实现的最佳选择。@jtahlborn我想他可以设置文件最大大小并进行检查,以便上传不会超过允许的文件大小。如果只接受小文件,似乎没有必要先在磁盘上保存。同时检查@PederN-我没有看到任何迹象表明OP只接受小文件。这不是他想要的吗?他想在永久保存之前获取一个上传的ZIP并检查是否有有效的XML(某种清单?),这只会验证您是否收到了客户端发送的字节。它不会检查发送的文件是否是zip文件。啊,我很抱歉-误解。:)我已经删除了以前的答案内容,并写了一个新的答案。这不是他要求的吗?他想在永久保存之前获取一个上传的ZIP并检查是否有有效的XML(某种清单?),这只会验证您是否收到了客户端发送的字节。它不会检查发送的文件是否是zip文件。啊,我很抱歉-误解。:)我删除了以前答案的内容,并写了一个新答案。感谢提示,我不知道检查“魔法字节”的方法,我使用的是contentType方法。感谢提示,我不知道检查“魔法字节”的方法,我使用的是contentType方法。