@GetMapping("/xiazai")
@ApiOperation(value = "查看个人文书", notes = "查看个人文书", tags = "查看个人文书")
public void xiazai(Long id, HttpServletResponse response)throws IOException {
List<TSyspCrimeSanshu> wenshu=tSyspDetentionService.findwenshu(id,new Long(0));
if (wenshu.size() != 0) {
// 创建临时路径,存放压缩文件
String zipFilePath = systemConfig.getWordAddress()+"三书一表.zip";
// 压缩输出流,包装流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
// 循环调用压缩文件方法,将一个一个需要下载的文件打入压缩文件包
for (TSyspCrimeSanshu path : wenshu) {
// 该方法在下面定义
fileToZip(path.getZxtzs(), zipOut);
}
// 压缩完成后,关闭压缩流
zipOut.close();
//拼接下载默认名称并转为ISO-8859-1格式
String fileName = new String(("三书一表.zip").getBytes(),"ISO-8859-1");
response.setHeader("Content-Disposition", "attchment;filename="+fileName);
//该流不可以手动关闭,手动关闭下载会出问题,下载完成后会自动关闭
ServletOutputStream outputStream = response.getOutputStream();
FileInputStream inputStream = new FileInputStream(zipFilePath);
// 如果是SpringBoot框架,在这个路径
// org.apache.tomcat.util.http.fileupload.IOUtils产品
// 否则需要自主引入apache的 commons-io依赖
// copy方法为文件复制,在这里直接实现了下载效果
IOUtils.copy(inputStream, outputStream);
CrimeAo crimeAo = new CrimeAo();
crimeAo.setWordAddress(zipFilePath);
// 关闭输入流
inputStream.close();
this.delete(crimeAo);
}
}
public static void fileToZip(String filePath,ZipOutputStream zipOut) throws IOException {
// 需要压缩的文件
File file = new File(filePath);
// 获取文件名称,如果有特殊命名需求,可以将参数列表拓展,传fileName
String fileName = file.getName();
FileInputStream fileInput = new FileInputStream(filePath);
// 缓冲
byte[] bufferArea = new byte[1024 * 10];
BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10);
// 将当前文件作为一个zip实体写入压缩流,fileName代表压缩文件中的文件名称
zipOut.putNextEntry(new ZipEntry(fileName));
int length = 0;
// 最常规IO操作,不必紧张
while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) {
zipOut.write(bufferArea, 0, length);
}
//关闭流
fileInput.close();
// 需要注意的是缓冲流必须要关闭流,否则输出无效
bufferStream.close();
// 压缩流不必关闭,使用完后再关
}
下载多个文件打成压缩包进行下载并删除
于 2022-03-07 16:49:45 首次发布