public static boolean fileToZip(List<byte[]>bytes, HttpServletResponse response) throws IOException {
String password="ctj";
boolean flag = false;
ByteArrayOutputStream byteTest = null;
ZipOutputStream zos = null;
try {
byteTest= new ByteArrayOutputStream();
zos = new ZipOutputStream(byteTest);
if(bytes!=null&&bytes.size()>0) {
ByteArrayInputStream is=null;
BufferedInputStream bis =null;
for(int i=0;i<bytes.size();i++){
byte[] b=bytes.get(i);
//zip实例
ZipParameters parameters = new ZipParameters();
//后缀可以更改的 zip文件内的名字
parameters.setFileNameInZip(h.get(i)+".xml");
// 压缩方式
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
//设置是否加密
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword(password.toCharArray());
parameters.setSourceExternalStream(true);
zos.putNextEntry(null,parameters);
// 读取待压缩的文件并写进压缩包里
is= new ByteArrayInputStream(b);
bis = new BufferedInputStream(is);
//zos.write(b);
byte[] buf = new byte[1024];
// 将字节从文件传输到ZIP文件
int len=0;
while ((len = bis.read(buf)) != -1) {
zos.write(buf, 0, len);
}
bis.close();// 记得关闭流
is.close();
zos.closeEntry();
}
}
} catch (ZipException e) {
e.printStackTrace();
}finally {
zos.close();
}
OutputStream ous = new BufferedOutputStream(response.getOutputStream());
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账套名字.zip", "UTF-8"));
response.addHeader("Content-Length", "" + byteTest.size());
response.setHeader("Access-Control-Allow-Origin", "*");
response.setContentType("application/octet-stream");
IOUtils.write(byteTest.toByteArray(),ous);
ous.flush();
ous.close();
flag=true;
return flag;
}
加一行清空缓存,强制输出的代码即可,代码如下:
while ((len = bis.read(buf)) != -1) {
zos.write(buf, 0, len);
}
改为
while ((len = bis.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.flush(); //添加该行代码