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());
        }
    }
AI 代码解读
}
AI 代码解读

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; //关闭转圈圈
        });
      },
AI 代码解读
目录
打赏
0
0
0
0
8
分享
相关文章
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
150 12
|
2月前
|
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
119 34
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
146 60
|
3月前
|
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
64 2
|
3月前
|
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
185 4
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
318 6
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
62 3
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
317 1
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
57 14