【问题标题】:How to verify the content of ZipFile before saving to disk如何在保存到磁盘之前验证 ZipFile 的内容
【发布时间】:2012-02-18 18:29:25
【问题描述】:

我有一个应用程序,它要求用户上传一个包含 xml 报告文件以及其他文件的 zip 文件。

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

我想在将此 zip 文件保存到磁盘/文件系统之前执行此操作,并且无需创建临时文件。只有通过验证,我才会保存文件。

我正在使用 Spring multipart CommonsMultipartFile 来管理上传。

应用正在使用Java、jsp、tomcat

谢谢。

【问题讨论】:

  • 检查 java2s.com/Code/Java/File-Input-Output/…,他们展示了几个使用 Java 的 ZIP 操作可能很有用。
  • 这似乎不太安全。如果您在服务器上收到文件的全部内容并将它们保存在内存中,则可能会导致服务器内存不足。在使用它们之前将未知大小的流写入临时文件几乎是总是健壮的服务器实现的最佳选择。
  • @jtahlborn 我猜他可以设置文件最大大小并检查以使上传不超过允许的文件大小。如果只接受小文件,似乎没有必要先保存在磁盘上。
  • @PederN - 我没有看到任何迹象表明 OP 只接受小文件。

标签: java file-upload upload zipfile


【解决方案1】:

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

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

但是检测magic bytes 会快得多,对于 ZIP 格式,50 4B

【讨论】:

  • 这不是他要的吗?他想在永久保存之前获取上传的 ZIP 并检查有效的 XML(某种清单?)。
  • 仅验证您是否收到了客户端发送的字节。它不会检查发送的文件是否实际上是一个 zip 文件。
  • 啊,那我道歉——误会了。 :)
  • 我已经删除了我之前回答的内容,并写了一个新的回答。
【解决方案2】:

请参阅我对 OP 的评论,了解在内存中缓冲整个文件的智慧。

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

【讨论】:

  • 感谢您的提示,我不知道这种检查“魔术字节”的方法我使用的是 contentType 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多