文件打包压缩下载到指定目录

多个文件夹(文件夹中有相应的文件)打包压缩到指定目录,并可以下载功能。

1. 先创建出项目编号文件夹

	String pDocPath = “XXX”  //根据需求,自行设置文件夹创建到哪里
    File pnFile = new File(pDocPath);
    if (!pnFile.exists()) {
      pnFile.mkdirs();
    }

2.将需要的本地文件复制到文件夹中

// 源文件地址
 String oldPath = “XXX”
 // 复制到目标的地址
 String newPath = "XXX";
File oldfile = new File(oldPath);
          if (oldfile.exists()) { // 文件存在时
            try (InputStream inStream = new FileInputStream(oldPath); // 读入原文件
                FileOutputStream fs = new FileOutputStream(newPath)) {
              byte[] buffer = new byte[1024 * 2];
              // int length;
              while ((byteread = inStream.read(buffer)) != -1) {
                fs.write(buffer, 0, byteread);
              }
            } catch (FileNotFoundException e) {
              e.printStackTrace();
              System.out.println("复制单个文件操作出错");
            } catch (IOException e) {
              e.printStackTrace();
              System.out.println("复制单个文件操作出错");
            }
          }

3.开始压缩

// 最后获取路径进行压缩
    String zipPath = null;
    // 设定文件压缩后放到哪里
    zipPath = “XXX”+ ".zip";
    try (FileOutputStream fos1 = new FileOutputStream(new File(zipPath)); ZipOutputStream zos = new ZipOutputStream(fos1)) {
      // 源文件(被压缩的文件)
      File sourceFile = new File(pDocPath);
      etmfPType1Service.compress(sourceFile, zos, sourceFile.getName(), true);
    } catch (FileNotFoundException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
    // 压缩完成,开始下载
    // 下载地址
    String uploadPath = zipPath;
    response.setContentType("application/force-download");// 设置强制下载不打开
    response.addHeader("Content-Disposition", "attachment;fileName=" + projectNo + ".zip");
    byte[] buffer = new byte[1024];
    try (FileInputStream fis = new FileInputStream(uploadPath);
        BufferedInputStream bis = new BufferedInputStream(fis);
        OutputStream os = response.getOutputStream()) {
      int i = bis.read(buffer);
      while (i != -1) {
        os.write(buffer, 0, i);
        i = bis.read(buffer);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

3.1 compress方法

在3.0中service调用了compress方法,方法内容在这里。

 /**
   * 
   * @param sourceFile 源文件
   * @param zos zip输出流
   * @param name 压缩后的名称
   * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
   * @throws Exception
   */
  public void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception {
    byte[] buf = new byte[1024];
    if (sourceFile.isFile()) {
      // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
      zos.putNextEntry(new ZipEntry(name));
      // copy文件到zip输出流中
      int len;
      FileInputStream in = new FileInputStream(sourceFile);
      while ((len = in.read(buf)) != -1) {
        zos.write(buf, 0, len);
      }
      // Complete the entry
      zos.closeEntry();
      in.close();
    } else {
      File[] listFiles = sourceFile.listFiles();
      if (listFiles == null || listFiles.length == 0) {
        // 需要保留原来的文件结构时,需要对空文件夹进行处理
        if (KeepDirStructure) {
          // 空文件夹的处理
          zos.putNextEntry(new ZipEntry(name + "/"));
          // 没有文件,不需要文件的copy
          zos.closeEntry();
        }
      } else {
        for (File file : listFiles) {
          // 判断是否需要保留原来的文件结构
          if (KeepDirStructure) {
            // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
            // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
            compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
          } else {
            compress(file, zos, file.getName(), KeepDirStructure);
          }
        }
      }
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值