下载多个文件打成压缩包进行下载并删除

@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();
    // 压缩流不必关闭,使用完后再关
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值