【发布时间】:2021-12-27 13:55:27
【问题描述】:
我们目前正在开发一项服务,该服务将归档数据并将其以ZipOutputStream 的形式返回给用户。我们目前正在寻找的是在服务器端出现问题时完全终止操作的选项。对于我们当前的实现(仅关闭响应输出流),错误会导致用户端的 zip 格式错误,但在尝试解压缩之前无法判断存档是否格式错误。期望的行为类似于下载终止(例如,从浏览器的角度来看,它会导致下载不成功的指示(红十字图标或类似的东西,取决于浏览器)明确告诉用户出现问题)。我们正在使用 Spring Boot,因此任何 Java 代码示例都将不胜感激,但如果您知道负责这种行为的底层 HTTP 机制,并且可以指出正确的方向,那也将不胜感激.
这是我们目前所拥有的(输出是 Spring REST 控制器的响应输出流 (HttpServletResponse.getOutputStream()):
try (ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
try {
for (ZipRecordFile fileInfo : zipRecord.listZipFileOverride()) {
InputStream fileStream = getFileStream(fileInfo.s3region(), fileInfo.s3bucket(),
fileInfo.s3key());
ZipEntry zipEntry = new ZipEntry(fileInfo.fileName());
zipOutputStream.putNextEntry(zipEntry);
fileStream.transferTo(zipOutputStream);
}
}
catch (Exception e) {
outputStream.close();
}
}
【问题讨论】:
-
尝试调用
zipOutputStream.finish()而不是outputStream.close(),完全没有帮助,存档很好,甚至可以正确解压缩。 -
如果发现异常,为什么不删除 zip?
-
@jhamon 不完全理解“删除拉链”的意思。在任何时候都没有要删除的 zip,只有一个 ZipOutputStream 将数据流式传输到客户端,从而在客户端生成一个 zip 存档
标签: java spring spring-boot http zipoutputstream