ZIP文件的导出

该代码片段展示了如何实现批量下载PDF文件并将其压缩为ZIP格式。在处理过程中,如果遇到相同的公司名称,会通过添加编号的方式避免文件重名。首先,根据请求参数获取记录ID,然后查询对应PDF,检查数据是否为空。接着,创建缓冲输出流和ZIP输出流,遍历PDF文件,使用ZIP条目为每个文件命名,并写入压缩包。如果在处理过程中发生异常,会抛出错误信息。
@PostMapping("/download/batch")
    @ApiOperation("批量下载PDF")
    @Export(type = "zip", defaultFileName = "完税证明")
    @MenuAuth
    public void downloadBatch(@RequestBody ReceiptDownLoadRequest receiptDownLoadRequest,
                              HttpServletRequest request,
                              HttpServletResponse response) {
        String recordIds = receiptDownLoadRequest.getRecordIds();
        List<Long> ids = Arrays.stream(recordIds.split(BaseConstant.COMMA))
                .map(Long::parseLong).collect(
                        Collectors.toList());
        List<ReceiptPO> receipts = receitService.getReceipts(ids);
        if (CollectionUtils.isEmpty(receipts)) {
            //查询到的数据为空
            throw new BizException(ResponseMsgEnum.QUERY_NOT_EXSIST);
        }
        try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                ZipOutputStream out = new ZipOutputStream(bos);
        ) {
            byte[] buf = new byte[1024];
            //处理公司名字一致时文件名问题
            dealWithSomeCompanyName(receipts);
            for (ReceiptPO receipt : receipts) {
                ByteArrayInputStream in = new ByteArrayInputStream(receipt.getFile());
                // 给列表中的文件单独命名
                out.putNextEntry(new ZipEntry(receipt.getCompanyName() + ".pdf"));
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                out.closeEntry();
                in.close();
            }
        } catch (Exception exception) {
            log.error("导出压缩文件失败", exception);
            throw new BizException(ResponseMsgEnum.FILE_DOWNLOAD_ERROR);
        }
    }

private void dealWithSomeCompanyName(List<ReceiptPO> receipts) {
        //按公司名排序
        receipts = receipts.stream().sorted(Comparator.comparing(ReceiptPO::getCompanyName))
                .collect(Collectors.toList());
        HashMap<String, ReceiptPO> map = new HashMap<>();
        int repeat = 0;
        for (ReceiptPO receipt : receipts) {
            ReceiptPO receiptPoByMap = map.get(receipt.getCompanyName());
            if (Objects.isNull(receiptPoByMap)) {
                //为空表示没出现重复公司名
                boolean contains = map.containsKey(receipt.getCompanyName());
                if (!contains) {
                    //公司名不存在已有key中,那么说明出现了第二家重复公司,值清零计算
                    repeat = 0;
                }
                map.put(receipt.getCompanyName(), receipt);
            } else {
                //有重复公司
                repeat++;
                String companyName = receipt.getCompanyName() + "(" + repeat + ")";
                receipt.setCompanyName(companyName);
            }
        }


    }

zip文件导出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值