java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等

导读:本篇文章讲解 java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip包下的zip工具类。

逻辑流程

  1. 获取前端请求接口和参数。

  2. 查询所有用户头像地址,并使用List<String> filePaths存储。

  3. 调用文件压缩方法。

  4. 写出文件流。

  5. 关闭文件流。

代码

请求接口

/**
 * 批量导出附件,附件以压缩包的形式下载
 */
@RequestMapping(value = "/downZip", method = RequestMethod.GET)
public void downZip(Long projectId, String keyword, HttpServletRequest request, HttpServletResponse response) {
      requiredCheck(projectId);
      Map<String, String> map = new HashMap<>();
      map.put("project.id", projectId.toString());
      List<CbcAddressBook> books = cbcAddressBookService.baseApiListObj(request, map, null, keyword, null, new String[]{"fileName"}, null).getResultData();
      List<String> filePaths = new LinkedList<>();
      for (int i = 0; i < books.size(); i++) {
          CbcAddressBook book = books.get(i);
          ifNullThrow(book.getFile(), "第" + (i + 1) + "行话单未上传文件");
          filePaths.add(getTomcatRootPath() + book.getFile().getRelativePath());
      }
      OutputStream out = null;
      ZipOutputStream zos = null;
      BufferedInputStream bis = null;
      try {
          out = response.getOutputStream();
          //创建压缩文件需要的空的zip包
          String zipBasePath = getTomcatRootPath() + "/upload/attachZip /";
          String zipName = DateUtil.ISO_DATETIME_FORMAT_NONE.format(new Date()) + ".zip";
          String zipFilePath = zipBasePath + File.separator + zipName;
          //压缩文件
          File zip = new File(zipFilePath);
          if (!zip.exists()) {
              zip.createNewFile();
          }
          //创建zip文件输出流
          zos = new ZipOutputStream(new FileOutputStream(zip));
          zipFile(zipBasePath, zipName, zipFilePath, filePaths, zos);
          zos.close();
          response.setContentType("text/html; charset=UTF-8"); //设置编码字符
          response.setContentType("application/octet-stream"); //设置内容类型为下载类型
          response.setHeader("Content-disposition", "attachment;filename=" + zipName);//设置下载的文件名称
          //将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出  
          bis = new BufferedInputStream(new FileInputStream(zipFilePath));
          byte[] buff = new byte[bis.available()];
          bis.read(buff);
          out.flush();//释放缓存
          out.write(buff);//输出数据文件
      } catch (IOException e) {
          e.printStackTrace();
          throw new GeneralBizException("-------------文件下载失败----------------");
      } finally {
          doClose(bis, out, zos);
      }
  }

压缩文件方法

 /**
     * 压缩文件
     *
     * @param zipBasePath 临时压缩文件基础路径
     * @param zipName     临时压缩文件名称
     * @param zipFilePath 临时压缩文件完整路径
     * @param filePaths   需要压缩的文件路径集合
     * @throws IOException
     */
    private String zipFile(String zipBasePath, String zipName, String zipFilePath, List<String> filePaths, ZipOutputStream zos) throws IOException {

        //循环读取文件路径集合,获取每一个文件的路径
        for (String filePath : filePaths) {
            File inputFile = new File(filePath);  //根据文件路径创建文件
            if (inputFile.exists()) { //判断文件是否存在
                if (inputFile.isFile()) {  //判断是否属于文件,还是文件夹
                    //创建输入流读取文件
                    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));
                    //将文件写入zip内,即将文件进行打包
                    zos.putNextEntry(new ZipEntry(inputFile.getName()));
                    //写入文件的方法,同上
                    int size = 0;
                    byte[] buffer = new byte[1024];  //设置读取数据缓存大小
                    while ((size = bis.read(buffer)) > 0) {
                        zos.write(buffer, 0, size);
                    }
                    //关闭输入输出流
                    zos.closeEntry();
                    bis.close();

                } else {  //如果是文件夹,则使用穷举的方法获取文件,写入zip
                    try {
                        File[] files = inputFile.listFiles();
                        List<String> filePathsTem = new ArrayList<String>();
                        for (File fileTem : files) {
                            filePathsTem.add(fileTem.toString());
                        }
                        return zipFile(zipBasePath, zipName, zipFilePath, filePathsTem, zos);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return null;
    }

关闭文件流

private void doClose(InputStream inputStream, OutputStream... outputStreams) {
  try {
        if (isNotNull(inputStream)) {
            inputStream.close();
        }
        if (isNotNull(outputStreams) && outputStreams.length > 0) {
            for (OutputStream outputStream : outputStreams) {
                outputStream.close();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99236.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!