java压缩文件或文件夹并返回流给前端


一、详细代码

1.Controller层

代码如下(示例):

    @PostMapping("/download")
    public GeneralResult downloadFilesTest(HttpServletRequest request,
                                           HttpServletResponse response){
        return scriptService.downloadFilesTest(request,response);
    }

2.Service层

   public void downloadFilesTest(HttpServletRequest request, HttpServletResponse response){
   String filePath = "D:/test" //test为D盘下的文件夹
   File file = new File(filePath);
   //创建输出流
   OutPutStream out = null;
   ZipOutputStream zos = null;
   try{
   out = response.getOutputStream();
   zos = new ZipOutputStream(out);
   compress(file,zos,file.getName()); //压缩文件方法
   //刷新流和关闭流,注意流的关闭顺序,否则压缩文件出来会损坏
   zipOutputStream.flush();
   out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (zipOutputStream != null) {
                try {
                    zipOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
   	 }
   }

 private static void compress(File sourceFile, ZipOutputStream zos, String name) throws IOException {
 	byte[] buf = new byte[1024];
 	if(sourceFile.isFile()){ //判断是否为文件
 	// 压缩单个文件,压缩后文件名为当前文件名
       zos.putNextEntry(new ZipEntry(name));
        // copy文件到zip输出流中
        int len;
        FileInputStream in = new FileInputStream(sourceFile);
        while ((len = in.read(buf)) > 0) {
            zos.write(buf, 0, len);
        }
        zos.closeEntry();
        in.close();
      }else { //路径文件为文件夹,用递归的方法压缩文件夹下的文件
         File[] listFiles = sourceFile.listFiles();
          if (listFiles == null || listFiles.length == 0) {
              // 空文件夹的处理
          } else {
              // 递归压缩文件夹下的文件
              for (File file : listFiles) {
                  compress(file, zos, name + "/" + file.getName());
              }
          }
      }
 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值