导出zip,本地生成文件和OSS下载文件整合

public void downloadZipForLandErrorEntListByLandUpErrorCriteria(
      LandUpErrorCriteria landUpErrorCriteria, HttpServletResponse response,
      HttpServletRequest httpServletRequest) throws IOException {

    //查询全部分页数据,用于导出
    PageWrapper<LandUpErrorDto> page = new PageWrapper<>();
    page.setPageNum(1);
    page.setPageSize(Integer.MAX_VALUE - 1);

    PageWrapper<LandUpErrorDto> pageList = (PageWrapper<LandUpErrorDto>) this
        .getLandErrorEntListByLandUpErrorCriteriaPageList(landUpErrorCriteria, page).getData();
    List<LandUpErrorDto> dataList =
        CollectionUtils.isNotEmpty(pageList.getResults()) ? pageList.getResults() : null;

    //校验查询结果是否为空
    if (CollectionUtils.isNotEmpty(dataList)) {
      try {
        String zipName = "异常用地企业清单及佐证材料.zip";
        //设置相关属性,否则容易出现下载的文件名是乱码或下划线
        String agent = httpServletRequest.getHeader("User-Agent").toLowerCase();
        if (agent.contains("msie") || agent.contains("like gecko")) {
          // win10 ie edge 浏览器 和其他系统的ie
          zipName = URLEncoder.encode(zipName, "UTF-8");
        } else {
          // fe
          zipName = new String(zipName.getBytes("UTF-8"), "iso-8859-1");
        }

        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment; fileName=" + zipName);

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
        Date curDate = new Date(System.currentTimeMillis());
        String timeStr = formatter.format(curDate);

        BufferedInputStream bis = null;

        try {
          ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
          OSSClient ossClient = new OSSClient(OssConfig.END_POINT, OssConfig.ACCESS_KEY_ID,
              OssConfig.ACCESS_KEY_SECRET);

          //根据分页数据中每一条记录中的oss地址(多个文件,多个地址)
          for (LandUpErrorDto dto : dataList) {
            List<String> fileNames = new ArrayList<>();
            if (StringUtils.isNotBlank(dto.getOssUrl())) {
              List<String> urlList = Arrays.asList(dto.getOssUrl().split(","));
              fileNames.addAll(urlList);
            }
            int sortNum = 1;
            for (String fileName : fileNames) {
              Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
              GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
                  OssConfig.BUCKET_NAME_OSS, fileName, HttpMethod.GET);
              // 设置过期时间。
              request.setExpiration(expiration);
              // 生成签名URL(HTTP GET请求)。
              URL signedUrl = ossClient.generatePresignedUrl(request);
              // 使用签名URL发送请求。
              OSSObject ossObject = ossClient.getObject(signedUrl, new HashMap<>());

              if (ossObject != null) {
                InputStream inputStream = ossObject.getObjectContent();
                byte[] buffs = new byte[1024 * 10];

                String[] strArray = fileName.split("\\.");
                int suffixIndex = strArray.length - 1;
                //zipFile 对应oss下载的文件在写入压缩包时重新命名的文件名
                String zipFile =
                    dto.getEntName() + "_" + timeStr + "_" + sortNum + "." + strArray[suffixIndex];
                ZipEntry zipEntry = new ZipEntry(zipFile);
                zos.putNextEntry(zipEntry);
                bis = new BufferedInputStream(inputStream, 1024 * 10);
                //读写操作
                int read;
                while ((read = bis.read(buffs, 0, 1024 * 10)) != -1) {
                  zos.write(buffs, 0, read);
                }
                ossObject.close();
              }
              sortNum++;
            }
          }

          //补充本地生成的excel文件
          File excelFile = null;
          try (InputStream resourceAsStream = httpServletRequest.getServletContext()
              .getClassLoader().getResourceAsStream("template/landUpErrorEntData.xlsx");
              Workbook workbook = landUpErrorService
                  .downloadLandErrorEntListByLandUpErrorCriteria(dataList, resourceAsStream);) {

            //workbook转成输入流
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            workbook.write(bos);
            ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());

            //压缩包内创建一个空文件
            excelFile = new File(CommonConfig.UPLOAD_PATH + "异常用地企业清单.xlsx");
            //读入需要下载的文件的内容,打包到zip文件
            zos.putNextEntry(new ZipEntry(excelFile.getName()));
            int dataLen;
            byte[] buffer = new byte[1024];
            while ((dataLen = bais.read(buffer)) > 0) {
              zos.write(buffer, 0, dataLen);
            }
            //关闭流
            bos.close();
            bais.close();
          }

          //关闭压缩包打包
          zos.closeEntry();
          zos.flush();
          zos.close();
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          //关闭流
          try {
            if (null != bis) {
              bis.close();
            }
            response.getOutputStream().flush();
            response.getOutputStream().close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }


      } catch (Exception e) {
        logger.error("==========用地异常zip下载失败", e);
      }
    }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值