我正在生成一个ZIP文件,其中包含一堆自动生成的XML文件。最近需求发生了变化,现在我必须生成ZIP的数倍(XML数据有所不同)并将其直接提供给客户端,而无需使用服务器中的实际文件。 我在做什么:
@Bean
public SaajSoapMessageFactory messageFactory() throws SOAPException {
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
messageFactory.setMessageFactory(MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL));
return messageFactory;
}
试图这样做,但给我错误:
// [... servlet handling ... ]
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=cierresZ_a_tangonet" + java.time.LocalDate.now() + ".zip");
// stream straight to client
ServletOutputStream out = response.getOutputStream();
ZipOutputStream zipped_out = new ZipOutputStream(out);
for( each data block from db ){
//CREATION AND PROCESSING OF XML FILES AS ZIP ENTRIES
byte[] xmlBinData = xmlData.toString().getBytes();
zipped_out.write(xmlBinData, 0, xmlBinData.length);
zipped_out.flush();
}
zipped_out.finish();
out.close();
}
编辑:对其进行了一些细微更改,但给出了相同的错误
// [... servlet handling ... ]
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=cierresZ_a_tangonet" + java.time.LocalDate.now() + ".zip");
// stream straight to client
ServletOutputStream out = response.getOutputStream();
for( each zip needed ){
ZipOutputStream zipped_out = new ZipOutputStream(out);
for( each data block from db ){
//CREATION AND PROCESSING OF XML FILES AS ZIP ENTRIES
byte[] xmlBinData = xmlData.toString().getBytes();
zipped_out.write(xmlBinData, 0, xmlBinData.length);
zipped_out.flush();
}
zipped_out.finish();
}
out.close();
}
答案 0 :(得分:0)
您需要finish()
和flush()
内部的所有ZipOutputStreams 和所有的外部ZipOutputStreams。
基本上:
response.setContentType("application/zip");
response.setHeader("Content-Disposition", ...);
ZipOutputStream mainZip = new ZipOutputStream(response.getOutputStream());
for (each file to download) {
ZipEntry zipEntry = new ZipEntry(fileName);
mainZip.putNextEntry(zipEntry);
if (file data available) {
// write file data to mainZip here
} else {
ZipOutputStream subZip = new ZipOutputStream(mainZip);
for (each subfile to download) {
ZipEntry zipEntry = new ZipEntry(subFileName);
subZip.putNextEntry(zipEntry);
// write subfile data to subZip here
}
subZip.finish();
subZip.flush(); // do not close
}
}
mainZip.finish();
mainZip.close(); // flushes for you
请注意,mainZip
和subZip
都如何获取 zip条目,并且都完成了 。这是您的代码中缺少的。