Java 生成Zip压缩文件,并下载功能

简介: 当文件比较大时,为了提高性能生成 压缩包,再下载提高效率。

1、直接上代码,看注释

public void exportMonthData1(Date dateTo,HttpServletRequest request, HttpServletResponse response) throws BaseBizException {
   
        List<String> fileNameList = new ArrayList<>();

        Date dateFrom =  new Date();
        String systemPath = "xxxxx/xxxxx/";
        Calendar cal = Calendar.getInstance();
        //这里是要获取要压缩的所有文件
        while(dateFrom.compareTo(dateTo) <= 0) {
   
            cal.setTime(dateFrom);
            Integer fromYear = cal.get(Calendar.YEAR);
            Integer fromMonth = cal.get(Calendar.MONTH);
            String dateFile = fromYear + String.format("%02d", fromMonth);
            File patchFile = new File(systemPath + dateFile);
            if(patchFile.exists()) {
   
                File[] listFile = patchFile.listFiles();
                for(File fileTemp : listFile) {
   
                    fileNameList.add(fileTemp.getPath());
                }
            }
            //加一个月
            cal.add(Calendar.MONTH, 1);
            dateFrom = cal.getTime();
        }
        //设置响应头信息
        response.reset();
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        //设置压缩包的名字,date为时间戳
        Date date = new Date();
        SimpleDateFormat dateformat = new SimpleDateFormat("yyMMddHHmm");
        String dateStr = dateformat.format(date);
        String downloadName = "压缩包" + dateStr + ".zip";

        //返回客户端浏览器的版本号、类型
        String agent = request.getHeader("USER-AGENT");
        try {
   
            //针对IE或者以IE为内核的浏览器:
            if (agent.contains("MSIE") || agent.contains("Trident")) {
   
                downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
            } else {
   
                //非IE浏览器的处理:
                downloadName = new String(downloadName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
            }
        } catch (Exception e) {
   
            //e.printStackTrace();
            logger.error("{}",e);
        }
        response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");
        //先创建一个ZipOutputStream,这里可以是FileOutputStream,还没时间测试
        //
        try(ZipOutputStream zipOs = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))){
   
            for(String fileName : fileNameList) {
   
                File file = new File(fileName);
                //这里的文件名,是压缩包里定义的,显示出来也是按这个目录
                ZipEntry entry = new ZipEntry(file.getName());
                zipOs.putNextEntry(entry);
                //增加文件内容,逐个添加
                try(FileInputStream fis = new FileInputStream(fileName)){
   
                    int len = 0;
                    byte[] buf = new byte[1024];
                    while ((len = fis.read(buf)) != -1) {
   
                        zipOs.write(buf, 0, len);
                    }
                    zipOs.flush();
                    fis.close();
                }
                zipOs.closeEntry();
            }
        } catch (IOException e) {
   
            //e.printStackTrace();
            logger.error("exportMonthData error : {} " ,e.getMessage());
        }
    }
}

2、配上controller和vue前端代码

@RequestMapping(value = "/exportmonthdata")
public void exportMonthData(HttpServletRequest request, HttpServletResponse response) throws IOException {
storagechargesService.exportMonthData( request, response);
}

前端vue的代码:

monthStoragechargeExport(){
   
        var _this = this;
        _this.exportLoad = true; //开启转圈圈
        _this.$axios.post("/xxxxx/xxxxx",_this.monthQuery,{
    responseType: "arraybuffer" }).then((result)=>{
   
          var downloadElement = document.createElement("a");
          var blob = new Blob([result], {
   type: "application/vnd.ms-excel;charset=utf-8" });
          var href = window.URL.createObjectURL(blob); //创建下载的链接
          downloadElement.style.display = "none";
          downloadElement.href = href;
          downloadElement.download = "xxxxx.zip"; //下载后文件名
          document.body.appendChild(downloadElement);
          downloadElement.click(); //点击下载
          document.body.removeChild(downloadElement); //下载完成移除元素
          window.URL.revokeObjectURL(href); //释放掉blob对象
          _this.exportLoad = false; //关闭转圈圈
        });
      },
相关文章
|
6天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
96 60
|
5天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
16 4
|
10天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
17天前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
19 3
|
16天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
27天前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
35 10
|
27天前
|
Oracle 安全 Java
Java 22 为开发人员带来了重大增强功能
Java 22 为开发人员带来了重大增强功能
33 9
|
21天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
20 1
|
30天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
34 5
|
1月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
233 1