Я пробую ZIP-файл и возвращаю ZIP-файл через сервлет.Это прекрасно работает, если у меня есть только один файл, но когда я пытаюсь добавить больше, кажется, что они просто добавляются к первому ZipEntry, и, следовательно, zip-архив поврежден.
private void writeZipResponse(HttpServletResponse response,
List<File> bundle) {
try {
ByteArrayOutputStream bout=new ByteArrayOutputStream();
ZipOutputStream zout = new ZipOutputStream(bout);
ServletOutputStream out =response.getOutputStream();
for (File file : bundle) {
FileInputStream fi = new FileInputStream(file);
byte bytes[] = new byte[(int)file.length()];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=fi.read(bytes, offset, bytes.length-offset)) >= 0)
{ offset += numRead; }
// Ensure all the bytes have been read in
if (offset < bytes.length) { throw new IOException("Could not completely read file "+file.getName()); }
fi.close();
ZipEntry zipEntry = new ZipEntry(file.getName());
//zipEntry.setCompressedSize(file.length());
zipEntry.setSize(offset);
CRC32 crc = new CRC32();
crc.update(bytes);
zipEntry.setCrc(crc.getValue());
zout.putNextEntry(zipEntry);
zout.write(bytes, 0, offset);
zout.closeEntry();
zout.finish();
fi.close();
}
zout.close();
response.setContentType("application/zip");
response.setHeader("Content-Disposition",
"attachment; filename=hivseqdb.zip;");
out.write(bout.toByteArray());
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}