java下载文件并压缩,一个类别的文件放到同一个文件夹下面


    /**
     * 
     * @param id
     * @param response
     */
    @Override
    public void download(Long id,  HttpServletResponse response) {
        Response responseFe;
        //设置响应头信息
        response.reset(); //清除缓存
        response.setCharacterEncoding("utf-8"); //设置编码
        response.setContentType("multipart/form-data");//设置发送到客户端的响应的内容类型(如果响应尚未提交)。给定的内容类型可以包括字符编码规范
        //构建下载的数据
        ResourceArea resourceArea = super.getById(id); //查询要下载的文件
        //设置压缩包的名字
        String downloadName = "压缩包" + resourceArea.getAreaTitle() + ".zip";

        //设置压缩流:直接写入response,实现边压缩边下载
        ZipOutputStream zipOutputStream = null;
        //循环将文件写入压缩流
        DataOutputStream os = null;
        try {
            
            response.setHeader("Content-Disposition", "attachment;filename=" +  URLEncoder.encode(downloadName, "utf-8"));
            zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
            //设置压缩方法
            zipOutputStream.setMethod(ZipOutputStream.DEFLATED);
            
            
            //应该先把子集找出来,分别吧每个子集关联的构建找出来  吧每个子集压缩成一个文件,然后把每个子集压缩后的文件打包到压缩包中
            ResourceAreaVo areaVo = new ResourceAreaVo();
            areaVo.setDelFlag("0");// 未删除
            areaVo.setCommitFlag(2L);//审批通过
            areaVo.setShelfStatus(1L);//已上架
            areaVo.setParentId(id);
            //查询一级分类下面的二级分类
            List<ResourceAreaVo> areaVoList = resourceAreaMapper.selectResourceAreaList(areaVo);
            if(StringUtils.isNotEmpty(areaVoList)){
                //查询二级分类下面的构建信息
                ResourceProduct resourceProduct = new ResourceProduct();
                resourceProduct.setDelFlag("0"); //未删除
                resourceProduct.setProductState(2); //审核通过
                for (ResourceAreaVo resourceAreaVo : areaVoList) {
                    resourceProduct.setBusinessId(resourceAreaVo.getId());
                    //构建列表
                    List<ResourceProduct> projectlist = resourceProductService.selectResourceProductList(resourceProduct);
                    //遍历文件信息(主要获取文件名/文件路径等)
                    for (ResourceProduct product : projectlist) {
                        //获取构建关联的文件
                        List<FileMessageVo> byProductId = resourceFilemessageService.getByProductId(product.getId());
                        for (FileMessageVo fileMessageVo : byProductId) {
                            try {
                                //查询的文件返回的是文件流
                                responseFe = minioServiceClient.downLoad(oauthUtil.getToken(), fileMessageVo.getFileId());
                                //将文件写入压缩流
                                addToZipFile(resourceAreaVo.getAreaTitle(),fileMessageVo.getFileName(), zipOutputStream, os, responseFe);
                            } catch (Exception e) {
                                log.error("下载文件出错![{}]"+e.getMessage());
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭流
            try {
                if (os != null) {
                    os.flush();
                    os.close();
                }
                if (zipOutputStream != null) {
                    zipOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 
     * @param folderName 文件夹名
     * @param fileName 文件名
     * @param zipOutputStream 压缩流
     * @param os 输出流
     * @param response 文件流
     * @throws IOException
     */
    private static void addToZipFile(String folderName,String fileName, ZipOutputStream zipOutputStream,DataOutputStream os,Response response) throws IOException {
        // 创建ZipEntry对象并设置文件名
        ZipEntry entry = new ZipEntry(folderName+"/"+fileName);
        zipOutputStream.putNextEntry(entry);
        os = new DataOutputStream(zipOutputStream);
        InputStream inputStream = response.body().asInputStream();
        byte[] b = new byte[100];
        int length;
        //读入需要下载的文件的内容,打包到zip文件
        while ((length = inputStream.read(b)) != -1) {
            os.write(b, 0, length);
        }
        //关闭流
        inputStream.close();
        zipOutputStream.closeEntry();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值