多个文件导出并打成zip压缩包下载

ps: 需要注意的是此方法即使只有一个文件也是导出成zip,所以如果需求是单个文件不压缩,多个文件才打包压缩的话需要前端处理调两个接口.这里只贴出打包导出的代码.
直接上Controller层代码,如下 :


    @ApiOperation("导出多个xlsx文件")
    @RequestMapping(path = "/exportMore", method = RequestMethod.GET)
    @ResponseBody
    public void downloadFile(HttpServletRequest request,HttpServletResponse response, @RequestParam @ApiParam(value = "业务对象id,中间用,分隔", required = true) String ids) throws Exception { 
        try { 
            response.setContentType("APPLICATION/OCTET-STREAM");
            response.setHeader("Content-Disposition", "attachment; filename=" + "export.zip");
            compressZip(ids, response.getOutputStream());
        } catch (IOException e) { 
        }
    }
    //----------------------------------下面是封装好的私有方法---------------------------------
    /** * 多个文件打包压缩下载方法 * * @param outputStream */
    private void compressZip(String ids, OutputStream outputStream) { 
    //我这里的ids是实体对象的id用英文逗号分隔拼成的字符串,
    //到业务实现类里面拿着去数据层取对象生成文件的,根据你们需求不同可以改
        ZipOutputStream zipOutStream = null;
        //------根据需求的不同每个人不一样,反正走完for循环得到一个文件集合就行-----
        List<File> fileList = Lists.newArrayList();
        for (String id : ids.split(",")) { 
        //------这一步是文件生成并给出路径,或者直接拿已有的文件的路径-----
             String filePath = xxxXxxService.makeFile(id);
             File file = new File(filePath);
             fileList.add(file);
        }
        try { 
            //-- 包装成ZIP格式输出流
            zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
            // -- 设置压缩方法
            zipOutStream.setMethod(ZipOutputStream.DEFLATED);
            //-- 下面将多文件循环写入压缩包
            for (File file : fileList) { 
                byte[] data = Files.readAllBytes(file.toPath());
                zipOutStream.putNextEntry(new ZipEntry(file.getName()));
                zipOutStream.write(data);
                zipOutStream.closeEntry();
                zipOutStream.flush();
                //不需要删除缓存文件的话不要下面这行
                file.delete();
            }
        } catch (IOException e) { 
            log.error(......)
        } finally { 
            IOUtils.closeQuietly(zipOutStream);
            IOUtils.closeQuietly(outputStream);
        }
    }

    原文作者:芒果yk
    原文地址: https://blog.csdn.net/liumeixiang777/article/details/119796048
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞