java 多文件压缩打包zip包

采自这篇文章哈:https://blog.csdn.net/caidie_huang/article/details/85162117

但是还是原创一下 修改一点

Controller层代码

/**
     * 下载全部附件
     */
    @PostMapping(value = "/downloadAllFile")
    public void  downloadAllFile(HttpServletResponse response, @RequestBody TaxDocumentDto taxDocumentDto) {//taxDocumentDto为自己需要入参的参数
        taxDocumentService.downloadAllFile(response,taxDocumentDto.getIds());
    }

Service层代码 此处log 是贴了标签@slf4j

public void downloadAllFile(HttpServletResponse response, List<Long> ids) {//ids是自己的入参
        String downloadName = "多选附件.zip";
        try {
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(downloadName, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("下载文件名编码时出现错误.", e);
        }

        OutputStream outputStream = null;
        ZipOutputStream zos = null;
        try {
            outputStream = response.getOutputStream();
            zos = new ZipOutputStream(outputStream);
            // 将文件流写入zip中
            downloadTolocal(zos, ids);

        } catch (IOException e) {
            log.error("downloadAllFile-xxx下载全部附件失败,ids=[{}],错误信息=[{}]", ids, e);
        } finally {
            if (zos != null) {
                try {
                    zos.close();
                } catch (Exception e2) {
                    log.info("关闭输入流时出现错误", e2);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (Exception e2) {
                    log.info("关闭输入流时出现错误", e2);
                }
            }

        }

    }

service中用到的方法 如果是直接取文件File的 把下文中的从文件服务器url中取流的方式修改一下就可以

/**
     * 将文件流写入zip中
     *
     * @param zos
     * @param ids
     */
    private void downloadTolocal(ZipOutputStream zos, List<Long> ids) {//此处ids是逻辑代码入参
        //以下为本人业务代码 请修改为自己的业务代码
        TaxDocumentExample example = new TaxDocumentExample();
        TaxDocumentExample.Criteria criteria = example.createCriteria();
        if (null == ids || ids.size() < 1) {
            throw new RuntimeException("传入参数错误:空参数数组");
        }
        criteria.andIdIn(ids);
        List<TaxDocument> taxDocuments = taxDocumentMapper.selectByExample(example);

        for (TaxDocument item : taxDocuments) {
            //文件url
            String urlPath = item.getFilePositionUrl();
            //如果url为null或空字符串而抛出异常
            if (StringUtils.isBlank(urlPath)) {
                throw new RuntimeException("文件url为空,id为:" + item.getId());
            }
            //文件名称(带后缀)
            String fileName = StringUtils.isBlank(item.getFileOriginalName()) ? "未知文件(请修改后缀名).xlsx" : item.getFileOriginalName();
            InputStream is = null;
            BufferedInputStream in = null;
            byte[] buffer = new byte[1024];
            int len;
            //创建zip实体(一个文件对应一个ZipEntry)
            ZipEntry entry = new ZipEntry(fileName);
            try {
                //获取需要下载的文件流
                URL httpurl = new URL(URLDecoder.decode(urlPath, "UTF-8"));
                HttpURLConnection httpConn = (HttpURLConnection)     
                httpurl.openConnection();
                httpConn.setDoOutput(true);// 使用 URL 连接进行输出
                httpConn.setDoInput(true);// 使用 URL 连接进行输入
                httpConn.setUseCaches(false);// 忽略缓存
                httpConn.setRequestMethod("GET");// 设置URL请求方法
                //可设置请求头
                httpConn.setRequestProperty("Content-Type", "application/octet-stream");
                httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
                httpConn.setRequestProperty("Charset", "UTF-8");
                httpConn.connect();
                if (httpConn.getResponseCode() >= 400) {
                    is = httpConn.getErrorStream();
                } else {
                    is = httpConn.getInputStream();
                }
                //以上为本人业务代码 请修改为自己的业务代码
                in = new BufferedInputStream(is);
                zos.putNextEntry(entry);
                //文件流循环写入ZipOutputStream
                while ((len = in.read(buffer)) != -1) {
                    zos.write(buffer, 0, len);
                }
            } catch (Exception e) {
                log.info("xxx--下载全部附件--压缩文件出错", e);
            } finally {
                if (entry != null) {
                    try {
                        zos.closeEntry();
                    } catch (Exception e2) {
                        log.info("xxx下载全部附件--zip实体关闭失败", e2);
                    }
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (Exception e2) {
                        log.info("xxx下载全部附件--文件输入流关闭失败", e2);
                    }
                }
                if (is != null) {
                    try {
                        is.close();
                    } catch (Exception e) {
                        log.info("xxx下载全部附件--输入缓冲流关闭失败", e);
                    }
                }


            }

        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值