ZipOutputStream zos = new ZipOutputStream(baos);
zos.putNextEntry(new ZipEntry("goods.txt"));
zos.write(bytes);
zos.flush();
zos.closeEntry();
baos.close(); // 過早關閉 ByteArrayOutputStream
zos.close();
os.write(baos.toByteArray()); // baos 已關閉,資料可能不完整
baos 再 toByteArray() 會導致資料截斷。response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=goods.zip");
response.setHeader("Content-Length", String.valueOf(baos.size())); // 可選
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
ServletOutputStream os = response.getOutputStream()) {
zos.putNextEntry(new ZipEntry("goods.txt"));
zos.write(bytes);
zos.closeEntry();
zos.finish(); // 關鍵:寫入中央目錄
byte[] data = baos.toByteArray();
response.setContentLength(data.length);
os.write(data);
os.flush();
}
zos.finish() 必須在 baos.toByteArray() **之前**呼叫。response.getOutputStream(),避免記憶體暴增。百度經驗:Java 生成 ZIP 下載完整範例