我正面临流关闭异常:当我有多个文件要处理时会触发该行为。
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
ZipOutputStream zipOut = new ZipOutputStream(out);
...
for (FileDto fileDto : listePdfFiles) {
String fileBaseName = FilenameUtils.getBaseName(fileDto.getName());
String fileExtension = "." + FilenameUtils.getExtension(fileDto.getName());
if (duplicateFileName.containsKey(fileDto.getName())) {
if (duplicateFileName.get(fileDto.getName()) > 0) {
fileBaseName += "(" + duplicateFileName.get(fileDto.getName()) + ")";
}
duplicateFileName.put(fileDto.getName(), duplicateFileName.get(fileDto.getName()) + 1);
}
ZipEntry zipEntry = new ZipEntry(fileBaseName + fileExtension);
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fileDto.getContent().read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
}
zipOut.closeEntry();
zipOut.close();
String random = String.format("%s", RandomStringUtils.randomAlphanumeric(8));
try(InputStream archive = new ByteArrayInputStream(out.toByteArray())) {
return FileDto.builder().content(archive)
...
}
} catch (Exception e) {
log.error("Exporting report to PDF error: ", e);
}
我调试了流程:第一个文件处理成功,但是在'(length = fileDto.getContent().read(bytes)'处忽略了第二个文件,没有对第二个文件进行任何处理,导致400错误。
我通过添加一个 try-catch 来处理异常来稍微调整代码,结果,可以下载包含两个文件的 zip 文件,但是第二个文件损坏了。